分散クエリでのデータ型のマッピング
OLE DB プロバイダは、DBTYPE という OLE DB の型識別子によってデータの型を公開します。データ型は、次のデータ マッピングにより OLE DB データ型と SQL Server システム データ型間で変換されます。
OLE DB データ型から SQL Server システム データ型へのマッピング。この変換は SQL Server が OLE DB データ ソースからデータを読み取るとき、SELECT ステートメント、または UPDATE、INSERT、DELETE ステートメントの読み取り側のいずれかで行われます。
SQL Server システム データ型から OLE DB データ型へのマッピング。この変換は、多くの場合 INSERT ステートメントまたは UPDATE ステートメントの中で、変更されたテーブルがリモート テーブルである OLE DB データ ソースに SQL Server がデータを書き込むときに行われます。
OLE DB プロバイダから SQL Server へのデータ型マッピング
OLE DB プロバイダから SQL Server へのデータ型マッピングは、使用できる比較と式、およびリモート データが関係する明示的で有効な変換を定義します。このマッピングを下記の表に示します。
式の中にあるリモート テーブルの列に関する型の妥当性は、データ型マッピング テーブルでその値に対応している SQL Server データ型が、同じコンテキストの中で有効な場合に、リモート列の値が Transact-SQL 式の中で有効になる、という規則に集約されます。
たとえば、local_column OPERATOR remote_column という式について考えてみましょう。この式では、local_column はローカル テーブルの列を、remote_column はリモート テーブルの列を表します。この式が有効になるのは、OPERATOR がローカル列のデータ型、および remote_column の DBTYPE のマップ先であるデータ型に有効な演算子である場合です。
同様に、CAST(remote_column AS data_type_1) は、remote_column の DBTYPE が SQL Server システム データ型 data_type_2 にマップされていて、data_type_2 から data_type_1 への明示的な変換が許可される場合は、有効です。たとえば、プロバイダ側で DBTYPE_DATE 型の列は、SQL Server では datetime 列に変換できます。しかし、DBTYPE_DATE データを直接 varchar に変換することはできません。
次の表は、データ型マッピング テーブルを示しています。列の DBTYPE インジケータとその DBCOLUMNFLAG 値を使用して、対応する SQL Server データ型を特定できます。
DBTYPE |
DBCOLUMNFLAGS |
SQL Server データ型 |
---|---|---|
DBTYPE_I1 |
numeric(3, 0)1 |
|
DBTYPE_I2 |
smallint |
|
DBTYPE_I4 |
int |
|
DBTYPE_I8 |
bigint |
|
DBTYPE_UI1 |
tinyint |
|
DBTYPE_UI1 |
numeric(5,0) |
|
DBTYPE_UI1 |
numeric(10,0) |
|
DBTYPE_UI1 |
numeric(20,0) |
|
DBTYPE_R4 |
float |
|
DBTYPE_R8 |
real |
|
DBTYPE_NUMERIC |
numeric |
|
DBTYPE_DECIMAL |
decimal |
|
DBTYPE_CY |
money |
|
DBTYPE_BSTR |
DBCOLUMNFLAGS_ISLONG = true |
ntext |
DBTYPE_BSTR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = true |
nchar |
DBTYPE_BSTR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = false |
nvarchar |
DBTYPE_IDISPATCH |
エラー |
|
DBTYPE_ERROR |
エラー |
|
DBTYPE_BOOL |
bit |
|
DBTYPE_VARIANT |
nvarchar(4000) |
|
DBTYPE_IUNKNOWN |
エラー |
|
DBTYPE_GUID |
uniqueidentifier |
|
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISLONG = true または最大列サイズ > 8,000 バイト |
image |
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISLONG = true かつ列サイズの制限なし |
varbinary(max) |
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISROWVER = true、DBCOLUMNFLAGS_ISFIXEDLENGTH = true、かつ列サイズ = 8 |
timestamp |
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISFIXEDLENGTH = true |
binary |
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISFIXEDLENGTH = false |
varbinary |
DBTYPE_STR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = true |
char |
DBTYPE_ STR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = false |
varchar |
DBTYPE_STR |
DBCOLUMNFLAGS_ISLONG = true または最大列サイズ > 8,000 文字 |
text |
DBTYPE_STR |
DBCOLUMNFLAGS_ISLONG = true かつ列サイズの制限なし |
varchar(max) |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISFIXED |
nchar |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = false |
nvarchar |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISLONG = true または最大列サイズ > 4,000 文字 |
ntext |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISLONG = true かつ列サイズの制限なし |
nvarchar(max) |
DBTYPE_UDT |
同等の SQL Server ユーザー定義型 (登録されている場合) |
|
DBTYPE_DATE |
date, datetime, datetime2, datetimeoffset |
|
DBTYPE_DBDATE |
date, datetime, datetime2, datetimeoffset (互換性レベルは 9.0 未満) |
|
DBTYPE_DBTIME |
time, datetime, datetime2, datetimeoffset |
|
DBTYPE_DBTIME_EX |
time, datetime2, datetimeoffset |
DBTYPE_DBTIMESTAMP |
time, date, datetime2, datetimeoffset, datetime |
|
---|---|---|
DBTYPE_DBTIMESTAMP |
time, date, datetime2, datetimeoffset |
|
DBTYPE_DBTIMESTAMP |
time, date, datetime2, datetimeoffset |
|
DBTYPE_ARRAY |
エラー |
|
DBTYPE_BYREF |
無視 |
|
DBTYPE_VECTOR |
エラー |
|
DBTYPE_RESERVED |
エラー |
|
DBTYPE_XML |
xml (パススルー クエリでのみ可) |
1numeric(p,s) は、精度が p で小数点以下桁数が s の SQL Server データ型 numeric を示しています。
注 |
---|
ここに示した既定値と異なる SQL Server データ型にデータを変換する必要がある場合は、CAST 関数や CONVERT 関数を使用した明示的な変換が必要です。詳細については、「CAST および CONVERT (Transact-SQL)」を参照してください。 |
DBTYPE インジケータと DBCOLUMNFLAGS 値の情報は、COLUMNS スキーマ行セットまたは IColumnsInfo インターフェイスを通じてプロバイダから提供されます。COLUMNS スキーマ行セットの場合は、DATA_TYPE 列と COLUMN_FLAGS 列が DBTYPE および DBCOLUMNFLAGS の値を表しています。IColumnsInfo::GetColumnInfo インターフェイスの場合は、DBCOLUMNINFO 構造体の wType メンバと dwFlags メンバがこの値を表しています。
SQL Server から OLE DB プロバイダへのデータ型マッピング
SQL Server システム データ型は、上記のテーブルのマッピングを使用して OLE DB 型にマップされます。次のいずれかの条件に該当する場合には、SQL Server 型の S1 から特定の OLE DB 型の T へのマッピングが可能です。
対応するマッピングがデータ型マッピング テーブルに存在する。
データ型 S1 から別の SQL Server データ型 S2 への有効な暗黙的な変換が存在し、S2 から T へのマッピングがデータ型マッピング テーブルに定義されている。
リモート サーバーから受信する日付データと時刻データの SQL Server 2008 のマッピング
次の表は、OLE DB データ ソースから SQL Server 2008 のインスタンスに送信されるデータの date データ型と time データ型のマッピングを示しています。この変換は SQL Server 2008 が OLE DB データ ソースからデータを読み取るとき、SELECT ステートメント、または UPDATE、INSERT、DELETE ステートメントの読み取り側のいずれかで行われます。リモート列のデータ型が、date、time、dateime2、または datetimeoffset の場合は、データベース互換性レベルが 100 以上であればその型が返されます。互換性レベルが 100 未満の場合は、SQL Server 2008 で datetime への暗黙の変換が行われます。
OLE DB 型 |
リモート サーバーが SQL Server 2008 の場合に 返されるデータ型 |
リモート サーバーが SQL Server 2005 または SQL Server 2000 の場合に返されるデータ型 |
リモート サーバーが SQL Server ではなく、ローカル SQL Server 2008 データベースの互換性レベルが 90 の場合に返されるデータ型 |
リモート サーバーが SQL Server ではなく、ローカル SQL Server 2008 データベースの互換性レベルが 100 の場合に返されるデータ型 |
---|---|---|---|---|
DBTYPE_DBTIMESTAMP (dwFlags が DBPARAMFLAGS_SS_ISVARIABLESCALE に設定されていない) |
datetime (リモート列は datetime か smalldatetime) |
datetime (リモート列は datetime か smalldatetime) |
datetime |
datetime2(7) |
DBTYPE_DBTIMESTAMP (dwFlags が DBPARAMFLAGS_SS_ISVARIABLESCALE に設定されている) |
datetime2 |
N/A |
N/A |
N/A |
DBTYPE_DBDATE |
date |
N/A |
datetime |
date |
DBTYPE_DBTIME |
time(0) |
N/A |
datetime |
time(0) |
DBTYPE_DBTIME2 |
time(n) |
N/A |
N/A |
N/A |
DBTYPE_DBTIMESTAMPOFFSET |
datetimeoffset |
N/A |
N/A |
N/A |
リモート サーバーに送信する日付データと時刻データの SQL Server 2008 のマッピング
次の表は、SQL Server 2008 のインスタンスから OLE DB データの送信先に送信されるデータの date データ型と time データ型のマッピングを示しています。この変換は、多くの場合 INSERT ステートメントまたは UPDATE ステートメントの中で、変更されたテーブルがリモート テーブルである OLE DB データ ソースに SQL Server 2008 がデータを書き込むときに行われます。
SQL Server 2008 のデータ型 |
リモート サーバーが SQL Server 2008 の場合に バインドされるデータ型 |
リモート サーバーが SQL Server 2005 または SQL Server 2000 の場合にバインドされるデータ型 |
リモート サーバーが SQL Server ではない場合にバインドされるデータ型 |
---|---|---|---|
datetime, smalldatetime |
DBTYPE_DBTIMESTAMP (dwFlags が DBPARAMFLAGS_SS_ISVARIABLESCALE に設定されていない) |
DBTYPE_DBTIMESTAMP (dwFlags が DBPARAMFLAGS_SS_ISVARIABLESCALE に設定されていない) |
DBTYPE_DBTIMESTAMP (dwFlags が DBPARAMFLAGS_SS_ISVARIABLESCALE に設定されていない) |
datetime2(n) |
DBTYPE_DBTIMESTAMP (dwFlags が DBPARAMFLAGS_SS_ISVARIABLESCALE に設定されている) |
DBTYPE_DBTIMESTAMP (dwFlags が DBPARAMFLAGS_SS_ISVARIABLESCALE に設定されていない) |
DBTYPE_DBTIMESTAMP (dwFlags が DBPARAMFLAGS_SS_ISVARIABLESCALE に設定されていない) |
date |
DBTYPE_DBDATE |
DBTYPE_DBDATE |
DBTYPE_DBDATE |
time(0) |
DBTYPE_DBTIME |
DBTYPE_DBTIME |
DBTYPE_DBTIME |
time(n) (0 < n <= 7) |
DBTYPE_DBTIMESTAMP (日付部分は保留) (dwFlags が DBPARAMFLAGS_SS_ISVARIABLESCALE に設定されている) |
DBTYPE_DBTIMESTAMP (dwFlags が DBPARAMFLAGS_SS_ISVARIABLESCALE に設定されていない) |
DBTYPE_DBTIMESTAMP (日付部分は保留) |
datetimeoffset |
DBTYPE_DBTIMESTAMPOFFSET |
N/A |
N/A |
SQL Server 2008 の date データ型と time データ型のリモート クエリの実行
SQL Server 2008 では、クエリが time、date、datetime2、または datetimoffset のいずれかのデータ型のリモート オブジェクトを参照している場合、そのクエリはローカルまたはリモート サーバーのいずれかで実行されます。どちらで実行されるかは、リモート サーバーのバージョンまたはプロバイダと、参照の型によって決まります。考慮される参照の型は、リモート列または定数、変数、またはローカルの列です。
SQL Server 以外のプロバイダ
time、date、および datetime2 の各データ型は、SQL Server 以外のプロバイダのリモート サーバーに同様の型が存在する場合、完全にはサポートされません。これらのプロバイダで、それらの型のサポートを宣言する方法はありません。
次の表は、リモート サーバーとローカル サーバーのどちらでクエリが実行されるかを示しています。最初の列は、ローカル サーバー上のデータ型を示しています。2 番目の列は、SQL Server 2008 のローカル インスタンスがリモート サーバーに対して使用する、対応する OLE DB データ型を示しています。最後の 3 つの列は、クエリがリモート サーバーとローカル サーバーのどちらで実行されるかを示しています。クエリが実行される場所は、リモート サーバーのバージョンや種類によって決まります。
ローカル サーバーのデータ型 |
ローカル SQL Server 2008 によって使用されるリモート サーバーの OLE DB データ型 |
SQL Server 2008 以降のバージョンのリモート サーバー |
SQL Server 2005 のリモート サーバー |
MSSQL 以外のリモート サーバー |
---|---|---|---|---|
datetime |
DBTYPE_DBTIMESTAMP |
リモート |
リモート |
リモート |
smalldatetime |
DBTYPE_DBTIMESTAMP |
リモート |
リモート |
リモート |
datetime2 |
DBTYPE_DBTIMESTAMP |
リモート |
ローカル |
リモート |
datetimeoffset |
DBTYPE_DBTIMESTAMPOFFSET |
リモート |
ローカル |
ローカル |
date |
DBTYPE_DBDATE |
リモート |
ローカル |
リモート |
time(>0) |
DBTYPE_DBTIME2 |
リモート |
ローカル |
ローカル |
time(0) |
DBTYPE_DBTIME2 |
リモート |
ローカル |
リモート |