分布式查询的数据类型映射
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 |
远程 |
本地 |
远程 |