資料類型對應和分散式查詢
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 將資料寫入 (大多在 INSERT 或 UPDATE 陳述式中) OLE DB 資料來源時發生,且所修改的資料表為遠端資料表。
從 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,或最大資料行大小 > 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 |
Equivalent 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 的對應。