Сопоставление типов данных в распределенных запросах
Поставщик 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 |
Удаленный |
Локальный |
Удаленный |
См. также