轉換函數
資料類型轉換可以通過CAST()和CONVERT()函數來實作。大多數情況下,這兩個函數是重疊的,它們反映了SQL語言的演化曆史。這兩個函數的功能相似,不過它們的文法不同。雖然并非所有類型的值都能轉變為其他資料類型,但總的來說,任何可以轉換的值都可以用簡單的函數實作轉換。
6.4.1 CAST()函數
CAST()函數的參數是一個表達式,它包括用AS關鍵字分隔的源值和目标資料類型。以下例子用于将文本字元串'123'轉換為整型:
- SELECT CAST('123' AS int)
傳回值是整型值123。如果試圖将一個代表小數的字元串轉換為整型值,又會出現什麼情況呢?
- SELECT CAST('123.4' AS int)
CAST()函數和CONVERT()函數都不能執行四舍五入或截斷操作。由于123.4不能用int資料類型來表示,是以對這個函數調用将産生一個錯誤:
- Server: Msg 245, Level 16, State 1, Line 1
-
Syntax error converting the varchar value
'123.4' to a column of data type int.
要傳回一個合法的數值,就必須使用能處理這個值的資料類型。對于這個例子,存在多個可用的資料類型。如果通過CAST()函數将這個值轉換為decimal類型,需要首先定義decimal值的精度與小數位數。在本例中,精度與小數位數分别為9與 2。精度是總的數字位數,包括小數點左邊和右邊位數的總和。而小數位數是小數點右邊的位數。這表示本例能夠支援的最大的整數值是9999999,而最小的小數是0.01。
- SELECT CAST('123.4' AS decimal(9,2))
decimal資料類型在結果網格中将顯示有效小數位:
- 123.40
精度和小數位數的預設值分别是18與0。如果在decimal類型中不提供這兩個值,SQL Server将截斷數字的小數部分,而不會産生錯誤。
- SELECT CAST('123.4' AS decimal)
結果是一個整數值:
- 123
在表的資料中轉換資料類型是很簡單的。下面的例子使用Product表,首先執行如下查詢:
- SELECT ProductNumber, ProductLine, ProductModelID
- FROM Production.Product
- WHERE ProductSubCategoryID < 4
假定産品經理已經建立了一個系統,用于唯一地辨別生産出來的每輛自行車,以便跟蹤其型号、類型和類别。他決定合并産品号、産品生産線辨別符、産品型号辨別符和一個順序号,為生産出來的每輛自行車建立一個唯一的序列号。在這個過程的第一步,他要求提供包括除順序号之外的所有屬性的所有可能産品的根辨別符。
如果使用下面的表達式,就不能得到希望的結果,如圖6-2所示。
- SELECT ProductNumber
- + '-'
- + ProductLine
- + ProductModelID AS BikeSerialNum
- + CAST(ProductModelID AS char(4)) AS BikeSerialNum