Сопоставление типов данных в распределенных запросах

Поставщик OLE DB отображает свои типы данных в соответствии с идентификаторами типов OLE DB, которые называются DBTYPE. Типы данных преобразуются из типов данных OLE DB в системные типы данных SQL Server с помощью сопоставления данных:

  • Из типов данных OLE DB в системные типы данных SQL Server. Это преобразование происходит, если SQL Server считывает данные из источника данных OLE DB.

  • Из системных типов данных SQL Server в типы данных OLE DB. Это преобразование происходит, если SQL Server записывает данные чаще всего с помощью инструкций INSERT или UPDATE в источник данных OLE DB, в котором изменяемая таблица является удаленной таблицей.

Сопоставление типов данных поставщика OLE DB и SQL Server

Сопоставление типов данных поставщика OLE DB и SQL Server определяет разрешенные сравнения и выражения, а также допустимые явные преобразования, которые затрагивают удаленные данные. Сопоставление показано в таблице ниже.

Правило проверки типов для столбцов удаленной таблицы в выражениях может быть описано следующим образом: значение удаленного столбца допустимо в выражении языка Transact-SQL, если соответствующий сопоставленный тип данных SQL Server в таблице сопоставлений типов данных является допустимым в этом контексте.

В качестве примера рассмотрим выражение: local_columnOPERATOR remote_column. В этом выражении local_column является столбцом локальной таблицы, а remote_column является столбцом удаленной таблицы. Это выражение допустимо, если OPERATOR является допустимым оператором для типа данных локального столбца и для типа данных, которому соответствует тип DBTYPE столбца remote_column.

Аналогично: выражение CAST(remote_column AS data_type_1) допустимо, если тип DBTYPE столбца remote_column сопоставлен с системным типом данных SQL Serverdata_type_2 и допустимо явное преобразование из типа data_type_2 в тип data_type_1. Например, столбец типа данных DBTYPE_DATE на стороне поставщика может быть преобразован в столбец datetime в SQL Server. Однако данные DBTYPE_DATE не могут быть преобразованы прямо в varchar.

Следующая таблица отображает таблицу сопоставлений типов данных. Используя признак DBTYPE и его значение DBCOLUMNFLAGS столбца, можно найти соответствующий тип данных 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) указывает на тип данных SQL Servernumeric с точностью p и масштабом s.

ПримечаниеПримечание

Если данные должны быть преобразованы в тип данных SQL Server, который отличается от показанного значения по умолчанию, необходимо использовать явное преобразование при помощи функций CAST или CONVERT. Дополнительные сведения см. в разделе Функции CAST и CONVERT (Transact-SQL).

Признак DBTYPE и сведения о значении DBCOLUMNFLAGS поступают от поставщика через набор строк схемы COLUMNS или через интерфейс IColumnsInfo. Для набора строк схемы COLUMNS столбцы DATA_TYPE и COLUMN_FLAGS представляют значения DBTYPE и DBCOLUMNFLAGS. Для метода IColumnsInfo::GetColumnInfo элементы wType и dwFlags структуры DBCOLUMNINFO представляют эти значения.

Сопоставление типов данных SQL Server и поставщика OLE DB

Системные типы данных SQL Server сопоставляются с типами OLE DB при помощи сопоставления, показанного в предыдущей таблице. Сопоставление типа SQL ServerS1 конкретному типу OLE DB T допустимо, если выполняется одно из этих условий:

  • Соответствующее сопоставление может быть найдено в таблице сопоставлений типов данных.

  • Существует допустимое неявное преобразование типа данных S1 в другой тип данных SQL ServerS2, и в таблице сопоставлений типов данных определено сопоставление типа S2 типу T.

SQL Server 2008. Сопоставление данных date и time, полученных от удаленного сервера

В следующей таблице представлено сопоставление типов данных date и time для данных, отправленных из источника данных OLE DB на экземпляр SQL Server 2008. Это преобразование происходит, если SQL Server 2008 считывает данные из источника данных OLE DB. Если удаленный столбец относится к типам данных date, time, dateime2 или datetimeoffset, возвращается этот же тип, когда уровень совместимости базы данных 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

Неприменимо

Неприменимо

Неприменимо

DBTYPE_DBDATE

date

Неприменимо

datetime

date

DBTYPE_DBTIME

time(0)

Неприменимо

datetime

time(0)

DBTYPE_DBTIME2

time(n)

Неприменимо

Неприменимо

Неприменимо

DBTYPE_DBTIMESTAMPOFFSET

datetimeoffset

Неприменимо

Неприменимо

Неприменимо

SQL Server 2008. Сопоставление данных date и time, отправленных на удаленный сервер

В следующей таблице представлено сопоставление типов данных date и time для данных, переданных с экземпляра SQL Server 2008 в источник данных OLE DB. Это преобразование происходит, если SQL Server 2008 записывает данные чаще всего с помощью инструкций INSERT или UPDATE в источник данных OLE DB, в котором изменяемая таблица является удаленной таблицей.

Тип данных 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

Неприменимо

Неприменимо

SQL Server 2008. Выполнение удаленных запросов с типами данных date и time

SQL Server 2008 выполняет запросы, в которых содержится ссылка на удаленные объекты типов time, date, datetime2 или datetimoffset на локальном или удаленном сервере. Решение зависит от версии или поставщика удаленного сервера, а также от типа ссылки. К рассматриваемым типам ссылок относятся удаленный столбец или константа, переменная или локальный столбец.

Поставщики, отличные от SQL Server

Предусмотрена частичная поддержка для типов данных time, date и datetime2, если на удаленном сервере для поставщиков, отличных от поставщиков SQL Server, имеются подобные типы. Эти поставщики не имеют способа объявления о своей поддержке данных типов.

В следующей таблице показано, будет ли запрос выполняться на локальном или удаленном сервере. В первом столбце показаны типы данных на локальном сервере. Во втором столбце показаны соответствующие типы данных OLE DB, используемые локальным экземпляром SQL Server 2008 для удаленного сервера. В трех последних столбцах показано, на каком сервере будет выполняться запрос: на удаленном или на локальном. Место выполнения зависит от версии или типа удаленного сервера.

Тип данных локального сервера

Тип данных OLE DB удаленного сервера, используемый локальным SQL Server 2008

Удаленным сервером является 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

Удаленный

Локальный

Удаленный