Сопоставление типов данных в распределенных запросах
Поставщик OLE DB отображает свои типы данных в терминах идентификаторов типов OLE DB, которые называются DBTYPEs. Типы данных преобразуются из типов данных 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 Server data_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 |
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) указывает на тип данных SQL Server numeric с точностью 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 Server S1 конкретному типу OLE DB T допустимо, если выполняется одно из этих условий:
- Соответствующее сопоставление может быть найдено в таблице сопоставлений типов данных.
- Существует допустимое неявное преобразование типа данных S1 в другой тип данных SQL Server S2, и в таблице сопоставлений типов данных определено сопоставление типа S2 типу T.
См. также
Основные понятия
Рекомендации по использованию распределенных запросов
Распределенные запросы