分布式查询的数据类型映射
OLE DB 访问接口根据 OLE DB 类型标识符 DBTYPE 显示其数据的数据类型。通过映射数据,在 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 |
datetime |
|
DBTYPE_DBDATE |
datetime(兼容级别低于 9.0。) |
|
DBTYPE_DBTIME |
datetime |
|
DBTYPE_DBTIMESTAMP |
datetime |
|
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 的映射。