共用方式為


資料類型轉換 (Database Engine)

下列情況中可以轉換資料類型:

  • 將一個物件的資料移到、比較或結合另一個物件的資料時,可能要將資料從一個物件的資料類型轉換成其他物件的資料類型。
  • 當 Transact-SQL 結果資料行的資料、傳回程式碼或輸出參數移入程式變數時,資料必須從 SQL Server 2005 系統資料類型轉換成變數的資料類型。

資料類型可以隱含或明確地轉換:

  • 使用者看不到隱含轉換。
    SQL Server 會自動將資料轉換成另一種資料類型。例如,如果將 smallintint 做比較,就會先將 smallint 隱含地轉換成 int,然後再進行比較。

  • 明確轉換使用 CAST 或 CONVERT 函數。
    CAST 與 CONVERT 函數會將數值 (本機變數、資料行或其他運算式) 轉換成另一個資料類型。例如,下列 CAST 函數會將 $157.27 的數值轉換成 '157.27' 的字元字串:

    CAST ( $157.27 AS VARCHAR(10) )
    

    如果希望 Transact-SQL 程式碼遵守 SQL-92,請使用 CAST 而不要用 CONVERT。使用 CONVERT 而不用 CAST 是為了獲得 CONVERT 中的樣式功能。

當您要將一個 SQL Server 物件的資料類型轉換到另一個,不支援部份隱含與明確資料類型的轉換。例如,nchar 值無法轉換成 image 值。您只能使用明確轉換將 nchar 轉換成 binary;不支援隱含轉換成 binary。但是,nchar 可以明確或隱含轉換成 nvarchar

處理 sql_variant 資料類型時,SQL Server 支援將有其他資料類型的物件隱含轉換成 sql_variant 類型。但是 SQL Server 不支援從 sql_variant 資料隱含轉換成其他資料類型的物件。

如需有關 SQL Server 物件之間支援的轉換的詳細資訊,請參閱<CAST 和 CONVERT (Transact-SQL)>。

在應用程式變數與 SQL Server 結果集資料行、傳回程式碼、參數或參數標記之間轉換時,支援的資料類型轉換是由資料庫 API 定義。如需詳細資訊,請參閱<將資料移到程式變數>。

資料類型轉換行為

本主題中的下列各節描述下列資料類型所顯示的轉換行為:

binary 和 varbinary 資料

float 和 real 資料

bit 資料

money 資料

Character 資料

decimal 和 numeric 資料

datetime 和 smalldatetime 資料

使用 OLE Automation 預存程序的資料類型

轉換 binary 與 varbinary 資料

當資料從字串資料類型 (charvarcharncharnvarcharbinaryvarbinarytextntextimage) 轉換成不等長的 binaryvarbinary 資料類型時,SQL Server 會填補或截斷右邊的資料。將其他資料類型轉換成 binaryvarbinary 時,則在左邊填補或截斷資料。使用十六進位零進行填補。

如果 binary 資料是搬移資料最簡易的方式,將資料轉換成為 binaryvarbinary 資料類型會非常有幫助。將各種資料類型的值轉換為有足夠大小的二進位值,然後再將值轉換回原來的資料類型,如果兩個轉換都在相同版本的 SQL Server 上進行,那麼將會得到相同的值。數值的二進位表示法可能會隨著不同的 SQL Server 版本而變更。

您可以將 intsmallinttinyint 轉換成 binaryvarbinary,但如果您將 binary 值轉換回整數值,若有發生截斷,則此值會與原始的整數值不同。例如,下列 SELECT 陳述式將通常顯示為 0x0001e240 的二進位顯示成整數值 123456

SELECT CAST( 123456 AS BINARY(4) )

但是,下列 SELECT 陳述式顯示如果 binary 目標太小,放不下整個數值,就會悄悄地將前面的位數截斷,所以同一個數字會儲存為 0xe240

SELECT CAST( 123456 AS BINARY(2) )

下列批次顯示悄悄截斷可能在不產生錯誤的情況下影響算術運算:

DECLARE @BinaryVariable2 BINARY(2)

SET @BinaryVariable2 = 123456
SET @BinaryVariable2 = @BinaryVariable2 + 1

SELECT CAST( @BinaryVariable2 AS INT)
GO

最後的結果是 57921,不是 123457

ms191530.note(zh-tw,SQL.90).gif附註:
在 SQL Server 版本之間轉換任何資料類型與 binary 資料類型,不保證結果都會一樣。

轉換成 bit 資料

轉換成 bit 會將任何非零的值升級成 1。

轉換字元資料

將字元運算式轉換成不同大小的字元資料類型時,對新資料類型而言太大的值會被截斷。

當字元運算式被轉換成不同資料類型或大小的字元運算式時,例如從 char(5) 轉換成 varchar(5),或從 char(20) 轉換成 char(15),輸入數值的定序會被指派轉換的數值。如果將非字元運算式轉換成字元資料類型,會將目前資料庫的預設定序指派給轉換的數值。不論哪一種狀況,都可以使用 COLLATE 子句指派特定的定序。

ms191530.note(zh-tw,SQL.90).gif附註:
支援 charvarchar 資料類型的字碼頁轉換,但不支援 text 資料類型的字碼頁轉換。舊版的 SQL Server,不會報告字碼頁翻譯期間的資料遺失。

轉換成近似 numeric 資料類型的字元運算式可以包含選擇性的指數標記法 (小寫 e 或大寫 E 後面跟著選擇性的加號 (+) 或減號 (-),再接著數字)。

轉換成正確 numeric 資料類型的字元運算式必須由數字、小數點和選擇性的加號 (+) 或減號 (-) 組成。前置的空白會被忽略。字串不能用逗號分隔符號 (如 123,456.00 中的千位分隔符號)。

轉換成 moneysmallmoney 資料類型的字元運算式也可以包含選擇性的小數點和錢幣符號 ($)。可用逗號分隔符號 (如 $123,456.00)。

下列範例示範如何轉換資料以供顯示。此範例會將銷售資料轉換成字元資料,然後執行字串比較,並將今天的日期轉換成樣式 3:dd/mm/yy。

USE AdventureWorks;
GO
SELECT SalesPersonID,
   CAST(SalesYTD AS varchar(12)),
   CONVERT(VARCHAR(12), GETDATE(), 3)
FROM Sales.SalesPerson
WHERE CAST(SalesYTD AS varchar(20) ) LIKE '1%'
GO

此範例將 uniqueidentifier 值轉換成 char 資料類型。

DECLARE @myid uniqueidentifier
SET @myid = NEWID()
SELECT CONVERT(char(255), @myid) AS 'char'
GO

此範例將今天的日期轉換成樣式 3:dd/mm/yy。

SELECT CONVERT(char(12), GETDATE(), 3)
GO

轉換 datetime 與 smalldatetime 資料

當您轉換成 datetime 時,SQL Server 2005 會拒絕所有無法辨識成日期的值。這些包括比西元 1 年 1 月 1 日 (January 1, 1A.D) 還早的日期。刀日期是在正確的範圍 (西元 1900 年 1 月 1 日到 2079 年 6 月 6 日) 時,您可以將 datetime 值轉換成 smalldatetime。時間值則是四捨五入到最接近的分鐘。

下列範例分別將 smalldatetimedatetime 值轉換成 varcharbinary 資料類型。

DECLARE @mydate_sm smalldatetime
SET @mydate_sm = '4/05/98'

SELECT CAST(@mydate_sm AS varchar) AS SM_DATE_VARCHAR
GO

DECLARE @mydate  datetime
SET @mydate     = '4/05/98'

SELECT  CAST(@mydate AS binary) AS DATE_BINARY
GO

以下為結果集:

(1 row(s) affected)

SM_DATE_VARCHAR                
------------------------------ 
Apr  5 1998 12:00AM            

(1 row(s) affected)

DATE_BINARY                                                    
-------------------------------------------------------------- 
0x0000000000000000000000000000000000000000000000008c3000000000 

(1 row(s) affected)

轉換 float 與 real 資料

float 值轉換成任何整數類型時會被截斷。

當您想要從 floatreal 轉換成字元資料時,使用 STR 字串函數比 CAST( ) 來得有用。這是因為 STR 可以對格式有較多的控制。如需詳細資訊,請參閱<STR (Transact-SQL)>和<函數 (Transact-SQL)>。

轉換 money 資料

當您從任何整數資料類型轉換成 money 時,會假設單位是貨幣單位。例如,整數值 4 轉換成 money 時相當於 4 個貨幣單位。

下列範例分別將 smallmoneymoney 值轉換成 varchardecimal 資料類型。

USE AdventureWorks;
GO
DECLARE @mymoney_sm smallmoney;
SET  @mymoney_sm = 3148.29;
SELECT  CAST(@mymoney_sm AS varchar) AS 'SM_MONEY varchar';
GO
DECLARE @mymoney    money;
SET  @mymoney    = 3148.29;
SELECT  CAST(@mymoney AS decimal)    AS 'MONEY DECIMAL';

GO

以下為結果集:

SM_MONEY VARCHAR               
------------------------------ 
3148.29                        

(1 row(s) affected)

MONEY DECIMAL          
---------------------- 
3148                   

(1 row(s) affected)

轉換 decimal 與 numeric 資料

對於 decimalnumeric 資料類型,SQL Server 會將每個有效位數和小數位數的特定結合視為不同的資料類型。例如,decimal(5,5)decimal(5,0) 是視為不同的資料類型。

在 Transact-SQL 陳述式中,會使用必要的最小有效位數與小數位數,自動將有小數點的常數轉換成 numeric 資料值。例如,常數 12.345 會轉換成有效位數 5、小數位數 3 的 numeric 值。

decimalnumeric 轉換到 floatreal 可能會流失有效位數。而從 intsmallinttinyintfloatrealmoneysmallmoney 轉換成 decimalnumeric 可能會造成溢位。

依預設,SQL Server 在將數字轉換成有效位數與小數位數較小的 decimalnumeric 值時會使用四捨五入。但是,如果 SET ARITHABORT 選項是 ON,SQL Server 會在發生溢位時產生錯誤。只是流失有效位數與小數位數還不足以產生錯誤。

使用 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 值,除了 binaryvarbinaryimage 值以外。這些值會在 Visual Basic 中轉換成一維的 Byte() 陣列。此陣列的範圍從 Byte(0 到 length1),其中 length 是 SQL Server binary 中的位元組數目、varbinaryimage 值。

這些轉換是從 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

請參閱

概念

將資料移到程式變數

其他資源

OLE Automation 預存程序 (Transact-SQL)
STR (Transact-SQL)
函數 (Transact-SQL)
CAST 和 CONVERT (Transact-SQL)
資料類型 (Transact-SQL)
COLLATE (Transact-SQL)

說明及資訊

取得 SQL Server 2005 協助