使用資料類型
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
...
...