資料類型轉換 (Database Engine)
下列情況中可以轉換資料類型:
將一個物件的資料移到、比較或結合另一個物件的資料時,可能要將資料從一個物件的資料類型轉換成其他物件的資料類型。
當 Transact-SQL 結果資料行、傳回碼或輸出參數的資料移至程式變數時,該資料必須從 SQL Server 系統資料類型,轉換成變數的資料類型。
在應用程式變數與 SQL Server 結果集資料行、傳回程式碼、參數或參數標記之間轉換時,所能使用的資料類型轉換是由資料庫 API 定義。
隱含及明確轉換
資料類型可以隱含或明確地轉換。
使用者看不到隱含轉換。 SQL Server 會自動將資料轉換成其他資料類型。 例如,如果將 smallint 與 int 做比較,就會先將 smallint 隱含地轉換成 int,然後再進行比較。
GETDATE() 會以隱含的方式轉換為日期樣式 0。 SYSDATETIME() 會以隱含的方式轉換為日期樣式 21。
明確轉換使用 CAST 或 CONVERT 函數。
CAST 與 CONVERT 函數會將數值 (本機變數、資料行或其他運算式) 轉換成另一個資料類型。 例如,下列 CAST 函數會將 $157.27 的數值轉換成 '157.27' 的字元字串:
CAST ( $157.27 AS VARCHAR(10) )
如果您希望 Transact-SQL 程式碼符合 ISO,請使用 CAST 來取代 CONVERT。 不使用 CAST 而使用 CONVERT,可以利用 CONVERT 的樣式功能。
下圖顯示 SQL Server 系統提供之資料類型所能使用的各種明確與隱含資料類型轉換。 其中包括 xml、bigint 和 sql_variant。 從 sql_variant 資料類型進行指派時,不可使用隱含轉換,但可以隱含轉換成 sql_variant。
資料類型轉換行為
當您要將某 SQL Server 物件的資料類型轉換成其他資料類型時,有部分隱含與明確資料類型的轉換不予支援。 例如,nchar 值無法轉換成 image 值。 您只可使用明確轉換將 nchar 轉換成 binary;隱含轉換成 binary 不予支援。 但 nchar 可以明確或隱含轉換成 nvarchar。
下列主題說明其對應資料類型所表現的轉換行為:
使用 OLE Automation 預存程序轉換資料類型
因為 SQL Server 使用 Transact-SQL 資料類型,而 OLE Automation 使用 Visual Basic 資料類型,所以 OLE Automation 預存程序必須轉換在兩者之間傳遞的資料。
下表說明從 SQL Server 到 Visual Basic 的資料類型轉換。
SQL Server 資料類型 |
Visual Basic 資料類型 |
---|---|
char, varchar, text, nvarchar, ntext |
String |
decimal,numeric |
String |
bit |
Boolean |
binary, varbinary, image |
一維 Byte() 陣列 |
int |
Long |
smallint |
Integer |
tinyint |
Byte |
float |
Double |
real |
Single |
money,smallmoney |
Currency |
datetime,smalldatetime |
Date |
設成 NULL 的任何類型 |
設成 Null 的 Variant |
所有單一的 SQL Server 值皆會被轉換成單一的 Visual Basic 值,但不包括 binary、varbinary 及 image 值。 這些值會在 Visual Basic 中轉換成一維的 Byte() 陣列。 此陣列的範圍從 Byte(0 到 length1),其中 length 是 SQL Server binary 中的位元組數目、varbinary 或 image 值。
這些轉換是從 Visual Basic 資料類型到 SQL Server 資料類型。
Visual Basic 資料類型 |
SQL Server 資料類型 |
---|---|
Long, Integer, Byte, Boolean, Object |
int |
Double,Single |
float |
Currency |
money |
Date |
datetime |
4000 或不到 4000 個字元的 String |
varchar/nvarchar |
大於 4000 個字元的 String |
text/ntext |
8000 或不到 8000 個位元組的一維 Byte() 陣列 |
varbinary |
大於 8000 個位元組的一維 Byte() 陣列 |
image |