使用資料型別
Transact-SQL 中所使用資料行和變數會有各自的「資料類型」。 運算式中值的行為取決於所參考資料行或變數其資料類型。 例如,如您先前所見,您可以使用 + 運算子串連兩個字串值,或將兩個數值相加。
下表顯示 SQL Server 資料庫中支援的一般資料類型。
| 精確數值 | 近似數值 | 字元 | 日期/時間 | 二進位 | 其他 |
|---|---|---|---|---|---|
| Tinyint | float | Char | 日期 | 二進位 | 資料指標 |
| SMALLINT | 真實 | varchar | 時間 | varbinary | hierarchyid |
| int | 日期時間 | sql_variant | |||
| Bigint | nchar | datetime2 | 表格 | ||
| 位元 | nvarchar | smalldatetime | 時間戳記 | ||
| 十進位/數值 | datetimeoffset | 唯一識別碼 | |||
| 數值 | XML | ||||
| 金錢 | 地理 | ||||
| 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 公路車架 - 黑色,58
706:HL 公路車架 - 紅色,58
707: 運動 -100 頭盔, 紅色
708: 運動 -100 頭盔, 黑色
...
不過,假設 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
...
可轉換為目標數值資料型態的數值會以 整 數回傳,而不相容的數值則以 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 公路車架 - 黑色,58
706:HL 公路車架 - 紅色,58
707: 運動 -100 頭盔, 紅色
708: 運動 -100 頭盔, 黑色
...
如同 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;
此查詢的結果如下所示:
開始銷售日期
開始日期
格式化的開始日期
2002-06-01T00:00:00.0000000
2002 年 6 月 1 日 上午 12:00
6/1/2002
2002-06-01T00:00:00.0000000
2002 年 6 月 1 日 上午 12:00
6/1/2002
2005-07-01T00:00:00.0000000
2005年7月1日上午12:00
7/1/2005
2005-07-01T00:00:00.0000000
2005年7月1日上午12:00
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;
此查詢的結果如下所示:
日期值
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
...
...