分布式查询的数据类型映射

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 数据类型。这种转换在 SQL Server 将数据写入 OLE DB 数据源(主要是在 INSERT 或 UPDATE 语句中)时发生,数据源中被修改的表是远程表。

从 OLE DB 访问接口到 SQL Server 的数据类型映射

从 OLE DB 访问接口映射到 SQL Server 的数据类型定义了允许的比较和表达式以及调用远程数据的有效显式转换。下表显示了该映射。

可以按下列规则概括表达式中远程表列的类型有效性:在相同的上下文中,如果数据类型映射表中对应的映射 SQL Server 数据类型有效,则 Transact-SQL 表达式中的远程列值有效。

例如表达式:local_columnOPERATOR remote_column。在此表达式中,local_column 是本地表列,remote_column 是远程表列。如果 OPERATOR 是本地列数据类型的有效运算符,也是 remote_column 的 DBTYPE 映射到的数据类型的有效运算符,则此表达式有效。

同样,如果 remote_column 的 DBTYPE 映射到 SQL Server 系统数据类型 data_type_2,并且允许从 data_type_2 显式转换到 data_type_1,则允许 CAST(remote_column AS data_type_1)。例如,可以将访问接口端的 DBTYPE_DATE 数据类型列转换为 SQL Server 中的 datetime 列。但是,不能将 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

Error

DBTYPE_ERROR

Error

DBTYPE_BOOL

bit

DBTYPE_VARIANT

nvarchar(4000)

DBTYPE_IUNKNOWN

Error

DBTYPE_GUID

uniqueidentifier

DBTYPE_BYTES

DBCOLUMNFLAGS_ISLONG = true,或最大列大小 > 8000 字节。

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

Error

DBTYPE_BYREF

忽略

DBTYPE_VECTOR

Error

DBTYPE_RESERVED

Error

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 接口,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 或更高将返回该类型。如果兼容级别较低,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 对发送到远程服务器的日期和时间日期的映射

下表显示了针对从 SQL Server 2008 的实例发送到 OLE DB 数据目标的 date 和 time 数据类型映射。这种转换在 SQL Server 2008 将数据写入 OLE DB 数据源(主要是在 INSERT 或 UPDATE 语句中)时发生,其中修改的表是远程表。

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 执行远程查询

SQL Server 2008 在本地服务器或远程服务器中执行引用具有 time、date、datetime2 或 datetimoffset 数据类型的远程对象的查询。决策取决于远程服务器的版本或访问接口以及引用类型。考虑的引用类型为远程列或常量、变量或本地列。

非 SQL Server 访问接口

当远程服务器上存在非 SQL Server 访问接口的相似类型时,则部分支持 time、date 和 datetime2 数据类型。这些访问接口无法声明它们对这些类型的支持。

下表显示了查询是在远程服务器上还是本地服务器上执行。第一列显示了本地服务器上的数据类型。第二列显示了 SQL Server 2008 的本地实例用于远程服务器的对应 OLE DB 数据类型。最后三列显示了查询是在远程服务器上还是本地服务器上执行。执行位置取决于远程服务器的版本或类型。

本地服务器数据类型

本地 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

远程

本地

远程