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

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

リモート

ローカル

リモート