使用資料類型

已完成

Transact-SQL 中所使用資料行和變數會有各自的「資料類型」。 運算式中值的行為取決於所參考資料行或變數其資料類型。 例如,如您先前所見,您可以使用 + 運算子串連兩個字串值,或將兩個數值相加。

下表顯示 SQL Server 資料庫中支援的一般資料類型。

精確數值

近似數值

字元

日期/時間

二進位

其他

tinyint

float

char

date

binary

cursor

smallint

real

varchar

time

varbinary

hierarchyid

int

text

Datetime

image

sql_variant

bigint

nchar

datetime2

table

bit

nvarchar

smalldatetime

timestamp

decimal/numeric

ntext

datetimeoffset

UNIQUEIDENTIFIER

numeric

xml

money

地理位置

SMALLMONEY

幾何

注意

如需不同資料類型及其屬性的詳細資訊,請造訪 Transact-SQL 參考文件

資料型別轉換

相容資料類型的值可視需要隱含轉換。 例如,假設您可以使用 + 運算子將一個 integer 數字與一個 decimal 數字相加,或將一個固定長度的 char 值與一個可變長度的 varchar 值串連。 不過,在某些情況下,您可能需要將值從一種資料類型明確轉換成另一種。例如,除非您先將數值轉換成相容的字串資料類型,否則嘗試使用 + 將一個 varchar 值與一個 decimal 值串連會導致錯誤。

注意

隱含和明確轉換可適用於某些資料類型,某些轉換則不適用。 如需詳細資訊,請使用 Transact-SQL 參考文件中的圖表。

T-SQL 包含可協助您明確轉換資料類型的函式

CAST 和 TRY_CAST

如果某個值與目標資料類型相容,則 CAST 函式會將該值轉換成指定的資料類型。 如果不相容,則會傳回錯誤。

例如,下列查詢會使用 CAST 將 ProductID 資料行中的 integer 值轉換成 varchar 值 (最多 4 個字元),以便將其與另一個以字元為主的值串連:

SELECT CAST(ProductID AS varchar(4)) + ': ' + Name AS ProductName
FROM Production.Product;

此查詢的可能結果如下所示:

ProductName

680: HL Road Frame - Black, 58

706: HL Road Frame - Red, 58

707: Sport-100 Helmet, Red

708: Sport-100 Helmet, Black

...

不過,假設 Production.Product 資料表中的 Size 資料行是 nvarchar (可變長度的 Unicode 文字資料) 資料行,其中包含一些數值大小 (例如 58) 和一些以文字為主的大小 (例如 "S"、"M" 或 "L")。 下列查詢會嘗試將此資料行中的值轉換成 integer 資料類型:

SELECT CAST(Size AS integer) As NumericSize
FROM Production.Product;

此查詢結果會產生下列錯誤訊息:

錯誤:將 nvarchar 值 'M' 轉換成資料類型 int 時轉換失敗。

假設資料行中至少有「部分」的值為數值,您可能想要轉換這些值並略過其他值。 您可以使用 TRY_CAST 函式轉換資料類型。

SELECT TRY_CAST(Size AS integer) As NumericSize
FROM Production.Product;

這次的結果如下所示:

NumericSize

58

58

NULL

NULL

...

可轉換成數值資料類型的值會以 decimal 值傳回,而不相容的值會以 NULL 傳回,用來表示值為「未知」

注意

我們將在本單元稍後探索處理 NULL 值時的考量。

CONVERT 和 TRY_CONVERT

CAST 是用於轉換資料類型的 ANSI 標準 SQL 函式,而且許多資料庫系統中會使用此函式。 在 Transact-SQL 中,您也可以使用 CONVERT 函式,如下所示:

SELECT CONVERT(varchar(4), ProductID) + ': ' + Name AS ProductName
FROM Production.Product;

同樣地,此查詢會傳回轉換成指定資料類型的值,如下所示:

ProductName

680: HL Road Frame - Black, 58

706: HL Road Frame - Red, 58

707: Sport-100 Helmet, Red

708: Sport-100 Helmet, Black

...

如同 CAST,CONVERT 具有 TRY_CONVERT 變體,會針對不相容的值傳回 NULL

使用 CONVERT 的另一個優於 CAST 之處,就是 CONVERT 還包含參數,可讓您在將數值和日期值轉換成字串時指定格式樣式。 例如,請考慮下列查詢:

SELECT SellStartDate,
       CONVERT(varchar(20), SellStartDate) AS StartDate,
       CONVERT(varchar(10), SellStartDate, 101) AS FormattedStartDate 
FROM SalesLT.Product;

此查詢的結果如下所示:

SellStartDate

StartDate

FormattedStartDate

2002-06-01T00:00:00.0000000

Jun 1 2002 12:00AM

6/1/2002

2002-06-01T00:00:00.0000000

Jun 1 2002 12:00AM

6/1/2002

2005-07-01T00:00:00.0000000

Jul 1 2005 12:00AM

7/1/2005

2005-07-01T00:00:00.0000000

Jul 1 2005 12:00AM

7/1/2005

...

...

...

注意

若要深入了解您可以搭配 CONVERT 使用的「樣式」格式化程式碼,請參閱 Transact-SQL 參考文件 (機器翻譯)。

PARSE 和 TRY_PARSE

PARSE 函式是專為轉換表示數值或日期/時間值的格式化字串所設計。 例如,請考慮下列查詢 (使用常值,而不是資料表中資料行的值):

SELECT PARSE('01/01/2021' AS date) AS DateValue,
   PARSE('$199.99' AS money) AS MoneyValue;

此查詢的結果如下所示:

DateValue

MoneyValue

2021-01-01T00:00:00.0000000

199.99

類似於 CAST 和 CONVERT,PARSE 具有 TRY_PARSE 變體,其會以 NULL 傳回不相容的值。

注意

使用小數或數字資料類型時,您可能需要四捨五入為整數或設定小數點,這可透過精確度和小數位數來達成。 若要進一步了解精確度和小數位數這個概念,請參閱 Transact-SQL 參考文件

STR

STR 函式會將數值轉換成 varchar

例如:

SELECT ProductID,  '$' + STR(ListPrice) AS Price
FROM Production.Product;

結果如下所示:

ProductID

價格

680

美金 $1432.00 元

706

美金 $1432.00 元

707

$35.00

...

...