在sql server日常的函式、儲存過程和sql語句中,經常會用到不同資料型別的轉換。在sql server有兩種資料轉換型別:一種是顯性資料轉換;另一種是隱性資料轉換。下面分別對這兩種資料型別轉換進行簡要的說明:
1 顯式轉換
顯示轉換是將某種資料型別的表示式顯式轉換為另一種資料型別。常用的是cast 和 convert 函式。
cast: cast ( expression as data_type )
convert: convert (data_type[(length)], expression [, style])
引數 expression 是任何有效的 microsoft sql server表示式。data_type 目標系統所提供的資料型別,不能使用使用者定義的資料型別。
2 隱性轉換
隱性轉換對於使用者是不可見的,由sql server 引擎自動處理。 隱性轉換自動將資料從一種資料型別轉換成另一種資料型別。例如,如果乙個 smallint 變數和乙個 int 變數相比較,這個 smallint 變數在比較前即被隱性轉換成 int 變數。 當從乙個 sql server 物件的資料型別向另乙個轉換時,一些隱性和顯式資料型別轉換是不支援的。例如,nchar 數值根本就不能被轉換成 image 數值。nchar 只能顯式地轉換成 binary,隱性地轉換到 binary 是不支援的。nchar 可以顯式地或者隱性地轉換成 nvarchar。
3 隱性轉換的風險
隱性轉換有的時候非常方便,可以簡化sql 指令碼,但是這裡面也孕育著潛在的風險,可能會出現在指令碼一開始執行的時候都是正常的,但卻某乙個時間點之後,程式莫名出現錯誤。下面舉乙個現實專案中的例子來說明。在sql server 2008中有乙個表,需要從兩個不同的資料表中拉取資料,由於這兩個資料表屬於不同的系統,其主鍵型別是不同的,乙個是int型別,乙個是guid,一開始想著這兩個都可以轉換成字元型別進行儲存。所以就在表中建立乙個nvarchar(50)的混合id列作為主鍵。如下圖所示:
一開始拉取的資料並未有guid的值,都是int型別轉換過來的資料,所以sql指令碼執行的正常,但是突然某一次執行時,出現了「在將 nvarchar 值 '4c185367-f004-41fe-8a0a-db4e819b1ff2' 轉換成資料型別 int 時失敗。」的錯誤。如下圖所示:
定位到指令碼,執行的sql如下:
select * from dbo.demo where 混合id=305
其中主鍵中的資料有guid轉換的字元型,也有int轉換的字串,示例資料如下:
但是如果執行下面的sql,則都是正常執行:
select * from dbo.demo where 混合id=305 and 名稱='int'
select * from dbo.demo where 混合id=305 and 序號='2'
select * from dbo.demo where 混合id=305 and 序號=2
select * from dbo.demo where 混合id='305' and 名稱='int'
select * from dbo.demo where 混合id='305'
複製**
結果如下:
出現上述錯誤的結果應該是這樣的:
select * from dbo.demo where 混合id=305在執行時,sql server會將nvarchar型別的隱性轉換成int型別,如果資料中沒有guid型別的字元,則轉換正常,如果有,當進行guid字元到int的隱性轉換時,則轉換失敗。
SQLServer 資料型別轉換
使用資料型別轉換 資料型別轉換應用 go 使用cast轉換 select studentname 的出生日期是 cast birthday as varchar 50 as 學生資訊 from students where studentid 100005 select studentname 的出...
SQL Server 轉換資料型別
1 cast 方法 cast 任何有效的表達試 as 要轉換的資料型別 資料型別的長度,可選 例 select cast 10000 as varchar 10 select cast 10000 as varchar 2 convert 方法 convert 要轉換的資料型別 資料型別長度,可選 ...
Sql Server資料型別轉換函式
sql server資料型別轉換函式是sql中最重要的函式之一,下面就為您介紹sql server資料型別轉換函式的詳細使用,供您參考,希望對您有所幫助。在一般情況下,sql server 會自動完成資料型別的轉換,例如,可以直接將字元資料型別或表示式與datatime 資料型別或表示式比較當表示式...