使用資料型別

已完成

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

...

...