Поделиться через


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

Поставщик 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.

ms175970.note(ru-ru,SQL.90).gifПримечание.
Если данные должны быть преобразованы в тип данных 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.

См. также

Основные понятия

Рекомендации по использованию распределенных запросов
Распределенные запросы

Другие ресурсы

Типы данных (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005