分散クエリでのデータ型のマッピング
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 |
datetime |
|
DBTYPE_DBDATE |
datetime (互換性レベルは 9.0 未満) |
|
DBTYPE_DBTIME |
datetime |
|
DBTYPE_DBTIMESTAMP |
datetime |
|
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 へのマッピングがデータ型マッピング テーブルに定義されている。