次の方法で共有


分散クエリでのデータ型のマッピング

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 を示しています。

ms175970.note(ja-jp,SQL.90).gifメモ :
ここに示した既定値と異なる 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 へのマッピングがデータ型マッピング テーブルに定義されている。

参照

概念

分散クエリを使用する場合のガイドライン
分散クエリ

その他の技術情報

データ型 (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手