將某種數據類型的表達式顯式轉換爲另外一種數據類型。CAST 和 CONVERT 提供類似的功能。web
使用 CAST:算法
CAST ( expression AS data_type )
sql
使用 CONVERT:數據庫
CONVERT (data_type[(length)], expression [, style])
express
expression安全
是任何有效的 Microsoft® SQL Server™ 表達式。有關更多信息,請參見表達式。函數
data_typespa
目標系統所提供的數據類型,包括 bigint 和 sql_variant。不能使用用戶定義的數據類型。有關可用的數據類型的更多信息,請參見數據類型。code
lengthorm
nchar、nvarchar、char、varchar、binary 或 varbinary 數據類型的可選參數。
style
日期格式樣式,藉以將 datetime 或 smalldatetime 數據轉換爲字符數據(nchar、nvarchar、char、varchar、nchar 或 nvarchar 數據類型);或者字符串格式樣式,藉以將float、real、money 或 smallmoney 數據轉換爲字符數據(nchar、nvarchar、char、varchar、nchar 或nvarchar 數據類型)。
SQL Server 支持使用科威特算法的阿拉伯樣式中的數據格式。
在表中,左側的兩列表示將 datetime 或 smalldatetime 轉換爲字符數據的 style 值。給 style 值加 100,可得到包括世紀數位的四位年份 (yyyy)。
不帶世紀數位 (yy) | 帶世紀數位 (yyyy) | 標準 |
輸入/輸出** |
---|---|---|---|
- | 0 或 100 (*) | 默認值 | mon dd yyyy hh:miAM(或 PM) |
1 | 101 | 美國 | mm/dd/yyyy |
2 | 102 | ANSI | yy.mm.dd |
3 | 103 | 英國/法國 | dd/mm/yy |
4 | 104 | 德國 | dd.mm.yy |
5 | 105 | 意大利 | dd-mm-yy |
6 | 106 | - | dd mon yy |
7 | 107 | - | mon dd, yy |
8 | 108 | - | hh:mm:ss |
- | 9 或 109 (*) | 默認值 + 毫秒 | mon dd yyyy hh:mi:ss:mmmAM(或 PM) |
10 | 110 | 美國 | mm-dd-yy |
11 | 111 | 日本 | yy/mm/dd |
12 | 112 | ISO | yymmdd |
- | 13 或 113 (*) | 歐洲默認值 + 毫秒 | dd mon yyyy hh:mm:ss:mmm(24h) |
14 | 114 | - | hh:mi:ss:mmm(24h) |
- | 20 或 120 (*) | ODBC 規範 | yyyy-mm-dd hh:mm:ss[.fff] |
- | 21 或 121 (*) | ODBC 規範(帶毫秒) | yyyy-mm-dd hh:mm:ss[.fff] |
- | 126(***) | ISO8601 | yyyy-mm-dd Thh:mm:ss:mmm(不含空格) |
- | 130* | 科威特 | dd mon yyyy hh:mi:ss:mmmAM |
- | 131* | 科威特 | dd/mm/yy hh:mi:ss:mmmAM |
* 默認值(style 0 或 100、9 或 10九、13 或 11三、20 或 120、21 或 121)始終返回世紀數位 (yyyy)。
** 當轉換爲 datetime 時輸入;當轉換爲字符數據時輸出。
*** 專門用於 XML。對於從 datetime 或 smalldatetime 到 character 數據的轉換,輸出格式如表中所示。對於從float、money 或 smallmoney 到 character 數據的轉換,輸出等同於 style 2。對於從 real 到 character 數據的轉換,輸出等同於 style 1。
重要 默認狀況下,SQL Server 根據截止年份 2049 解釋兩位數字的年份。即,兩位數字的年份 49 被解釋爲 2049,而兩位數字的年份 50 被解釋爲 1950。許多客戶端應用程序(例如那些基於 OLE 自動化對象的客戶端應用程序)都使用 2030 做爲截止年份。SQL Server 提供一個配置選項("兩位數字的截止年份"),藉以更改 SQL Server 所使用的截止年份並對日期進行一致性處理。然而最安全的辦法是指定四位數字年份。
當從 smalldatetime 轉換爲字符數據時,包含秒或毫秒的樣式將在這些位置上顯示零。當從 datetime 或smalldatetime 值進行轉換時,能夠經過使用適當的 char 或 varchar 數據類型長度來截斷不須要的日期部分。
下表顯示了從 float 或 real 轉換爲字符數據時的 style 值。
值 | 輸出 |
---|---|
0(默認值) | 最大爲 6 位數。根據須要使用科學記數法。 |
1 | 始終爲 8 位值。始終使用科學記數法。 |
2 | 始終爲 16 位值。始終使用科學記數法。 |
在下表中,左列表示從 money 或 smallmoney 轉換爲字符數據時的 style 值。
值 | 輸出 |
---|---|
0(默認值) | 小數點左側每三位數字之間不以逗號分隔,小數點右側取兩位數,例如 4235.98。 |
1 | 小數點左側每三位數字之間以逗號分隔,小數點右側取兩位數,例如 3,510.92。 |
2 | 小數點左側每三位數字之間不以逗號分隔,小數點右側取四位數,例如 4235.9819。 |
返回與 data type 0 相同的值。
隱性轉換指那些沒有指定 CAST 或 CONVERT 函數的轉換。而顯式轉換指那些已指定了所需 CAST (CONVERT) 函數的轉換。下面的圖表顯示了全部可用於 SQL Server 系統提供的數據類型的顯式和隱性轉換,這些數據類型包括bigint 和 sql_variant。
說明 由於 Unicode 數據始終使用偶數位字節,因此當在 binary 或 varbinary 數據類型與 Unicode 所支持的數據類型之間進行轉換時會使用提示。例如,此轉換不返回 41 的十六進制值,而是返回 4100 的十六進制值:SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary)
不支持 text 和 image 數據類型的自動數據類型轉換。能夠將 text 數據顯式轉換爲字符數據,將 image 數據顯性轉換爲 binary 或 varbinary 數據,可是最大長度爲 8000。若是嘗試進行不正確的轉換(例如,將包含字母的字符表達式轉換爲 int),則 SQL Server 會產生錯誤信息。
當 CAST 或 CONVERT 的輸出是字符串而且輸入也是字符串時,輸出與輸入具備相同的排序規則和排序規則標籤。若是輸入不是字符串,則輸出採用數據庫的默認排序規則及強制默認的排序規則標籤。有關更多信息,請參見排序規則的優先順序。
若要給輸出指派不一樣的排序規則,請將 COLLATE 子句應用到 CAST 或 CONVERT 函數的結果表達式中。例如:
SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS
不存在有關賦值的從 sql_variant 數據類型進行的隱性轉換,可是存在轉換爲 sql_variant 的隱性轉換。
將字符或二進制表達式(char、nchar、nvarchar、varchar、binary 或 varbinary)轉換爲不一樣數據類型的表達式時,數據可能會被截斷,只顯示一部分,或者由於結果過短沒法顯示而返回錯誤。除下表中所顯示的轉換外,轉換爲 char、varchar、nchar、nvarchar、binary 和 varbinary 時將被截斷。
被轉換的數據類型 | 轉換爲的數據類型 | 結果 |
---|---|---|
int、smallint 或 tinyint | char | * |
varchar | * | |
nchar | E | |
nvarchar | E | |
money、smallmoney、numeric、decimal、float或 real | char | E |
varchar | E | |
nchar | E | |
nvarchar | E |
* 結果長度過短而沒法顯示。
E 由於結果長度過短沒法顯示而返回錯誤。
Microsoft SQL Server 僅保證往返轉換(即,從原始數據類型進行轉換後又返回原始數據類型)在各版本間產生相同值。下面的示例顯示往返轉換:
DECLARE @myval decimal (5, 2) SET @myval = 193.57 SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5)) -- Or, using CONVERT SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))
例如,不要嘗試構造 binary 值並將它們轉換爲數字數據類型分類的數據類型。SQL Server 並不保證 decimal 或numeric 數據類型轉換爲 binary 的結果在 SQL Server 各版本間相同。
下面的示例顯示了因爲過短而沒法顯示的結果表達式。
USE pubs SELECT SUBSTRING(title, 1, 25) AS Title, CAST(ytd_sales AS char(2)) FROM titles WHERE type = 'trad_cook'
下面是結果集:
Title ------------------------- -- Onions, Leeks, and Garlic * Fifty Years in Buckingham * Sushi, Anyone? * (3 row(s) affected)
當具備不一樣小數位數的數據類型進行轉換時,值將被截斷爲最精確的數位。例如,SELECT CAST(10.6496 AS int) 的結果爲 10。
轉換時,若目標數據類型的小數位數小於源數據類型的小數位數,則要轉換的值將被四捨五入。例如,CAST(10.3496847 AS money) 的結果是 $10.3497。
當將非數字類型的 char、nchar、varchar 或 nvarchar 數據轉換爲 int、float、numeric 或 decimal 時,SQL Server 將返回錯誤信息。當將空字符串 (" ") 轉換爲 numeric 或 decimal 時,SQL Server 也將返回錯誤信息。
當 binary 或 varbinary 數據轉換爲字符數據而且在 x 後面指定了奇數位的值時,SQL Server 在 x 後面添加 0(零)以成爲偶數位值。
二進制數據包含從 0 到 9 和從 A 到 F(或從 a 到 f)的字符,每兩個字符爲一組。二進制字符串必須以 0x 開頭。例如,若要輸入 FF,請鍵入 0xFF。最大值是一個 8000 字節的二進制值,每一個字節的最大值都是 FF。Binary 數據類型不能用於十六進制數據,而是用於位模式。對於存儲爲二進制數據的十六進制數字的轉換和計算結果,沒法保證其準確性。
當指定 binary 數據類型的長度時,每兩個字符被算做是一個單位長度。長度 10 表示將輸入 10 個雙字符組。
由 0x 表示的空二進制字符串能夠儲存爲二進制數據。
每一個示例都將檢索書名(這些圖書的截止當前銷售額的第一位數字爲 3),並將這些圖書的 ytd_sales 轉換爲char(20)。
-- Use CAST. USE pubs GO SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales FROM titles WHERE CAST(ytd_sales AS char(20)) LIKE '3%' GO -- Use CONVERT. USE pubs GO SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales FROM titles WHERE CONVERT(char(20), ytd_sales) LIKE '3%' GO
下面是任一查詢的結果集:
Title ytd_sales ------------------------------ ----------- Cooking with Computers: Surrep 3876 Computer Phobic AND Non-Phobic 375 Emotional Security: A New Algo 3336 Onions, Leeks, and Garlic: Coo 375 (4 row(s) affected)
下面的示例經過將總的截止當前銷售額 (ytd_sales) 與每本圖書的價格 (price) 相除,進行單獨列計算 (Copies)。在四捨五入到最接近的整數後,此結果將轉換爲 int 數據類型。
USE pubs GO SELECT CAST(ROUND(ytd_sales/price, 0) AS int) AS 'Copies' FROM titles GO
下面是結果集:
Copies ------ 205 324 6262 205 102 7440 NULL 383 205 NULL 17 187 16 204 418 18 1263 273 (18 row(s) affected)
下面的示例使用 CAST 數據類型轉換函數來串聯非字符、非二進制表達式。
USE pubs GO SELECT 'The price is ' + CAST(price AS varchar(12)) FROM titles WHERE price > 10.00 GO
下面是結果集:
------------------ The price is 19.99 The price is 11.95 The price is 19.99 The price is 19.99 The price is 22.95 The price is 20.00 The price is 21.59 The price is 10.95 The price is 19.99 The price is 20.95 The price is 11.95 The price is 14.99 (12 row(s) affected)
下面的示例在選擇列表中使用 CAST 將 title 列轉換爲 char(50) 列,這樣結果將更加易讀。
USE pubs GO SELECT CAST(title AS char(50)), ytd_sales FROM titles WHERE type = 'trad_cook' GO
下面是結果集:
ytd_sales -------------------------------------------------- --------- Onions, Leeks, and Garlic: Cooking Secrets of the 375 Fifty Years in Buckingham Palace Kitchens 15096 Sushi, Anyone? 4095 (3 row(s) affected)
下面的示例將 int 列(ytd_sales 列)轉換爲 char(20) 列,以便使用 LIKE 子句。
USE pubs GO SELECT title, ytd_sales FROM titles WHERE CAST(ytd_sales AS char(20)) LIKE '15%' AND type = 'trad_cook'GO
下面是結果集:
title ytd_sales ------------------------------------------------------------ ----------- Fifty Years in Buckingham Palace Kitchens 15096 (1 row(s) affected)