SQL Server數(shù)據(jù)類型轉(zhuǎn)換方法
在SQL Server日常的函數(shù)、存儲過程和SQL語句中,經(jīng)常會用到不同數(shù)據(jù)類型的轉(zhuǎn)換。在SQL Server有兩種數(shù)據(jù)轉(zhuǎn)換類型:一種是顯性數(shù)據(jù)轉(zhuǎn)換;另一種是隱性數(shù)據(jù)轉(zhuǎn)換。下面分別對這兩種數(shù)據(jù)類型轉(zhuǎn)換進行簡要的說明:
1 顯式轉(zhuǎn)換
顯示轉(zhuǎn)換是將某種數(shù)據(jù)類型的表達式顯式轉(zhuǎn)換為另一種數(shù)據(jù)類型。常用的是CAST 和 CONVERT 函數(shù)。
CAST: CAST ( expression AS data_type )
CONVERT: CONVERT (data_type[(length)], expression [, style])
參數(shù) expression 是任何有效的 Microsoft SQL Server表達式。data_type 目標系統(tǒng)所提供的數(shù)據(jù)類型,不能使用用戶定義的數(shù)據(jù)類型。
2 隱性轉(zhuǎn)換
隱性轉(zhuǎn)換對于用戶是不可見的,由SQL Server 引擎自動處理。 隱性轉(zhuǎn)換自動將數(shù)據(jù)從一種數(shù)據(jù)類型轉(zhuǎn)換成另一種數(shù)據(jù)類型。例如,如果一個 smallint 變量和一個 int 變量相比較,這個 smallint 變量在比較前即被隱性轉(zhuǎn)換成 int 變量。 當從一個 SQL Server 對象的數(shù)據(jù)類型向另一個轉(zhuǎn)換時,一些隱性和顯式數(shù)據(jù)類型轉(zhuǎn)換是不支持的。例如,nchar 數(shù)值根本就不能被轉(zhuǎn)換成 image 數(shù)值。nchar 只能顯式地轉(zhuǎn)換成 binary,隱性地轉(zhuǎn)換到 binary 是不支持的。nchar 可以顯式地或者隱性地轉(zhuǎn)換成 nvarchar。
3 隱性轉(zhuǎn)換的風險
隱性轉(zhuǎn)換有的時候非常方便,可以簡化SQL 腳本,但是這里面也孕育著潛在的風險,可能會出現(xiàn)在腳本一開始運行的時候都是正常的,但卻某一個時間點之后,程序莫名出現(xiàn)錯誤。下面舉一個現(xiàn)實項目中的例子來說明。在SQL Server 2008中有一個表,需要從兩個不同的數(shù)據(jù)表中拉取數(shù)據(jù),由于這兩個數(shù)據(jù)表屬于不同的系統(tǒng),其主鍵類型是不同的,一個是int類型,一個是GUID,一開始想著這兩個都可以轉(zhuǎn)換成字符類型進行存儲。所以就在表中建立一個nvarchar(50)的混合ID列作為主鍵。如下圖所示:
一開始拉取的數(shù)據(jù)并未有GUID的值,都是INT類型轉(zhuǎn)換過來的數(shù)據(jù),所以SQL腳本運行的正常,但是突然某一次運行時,出現(xiàn)了“在將 nvarchar 值 '4C185367-F004-41FE-8A0A-DB4E819B1FF2' 轉(zhuǎn)換成數(shù)據(jù)類型 int 時失敗?!钡腻e誤。如下圖所示:
定位到腳本,執(zhí)行的SQL如下:
select * from dbo.Demo where 混合ID=305
其中主鍵中的數(shù)據(jù)有GUID轉(zhuǎn)換的字符型,也有INT轉(zhuǎn)換的字符串,示例數(shù)據(jù)如下:
但是如果執(zhí)行下面的SQL,則都是正常執(zhí)行:
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'
結(jié)果如下:
出現(xiàn)上述錯誤的結(jié)果應該是這樣的:
select * from dbo.Demo where 混合ID=305在執(zhí)行時,SQL Server會將nvarchar類型的隱性轉(zhuǎn)換成int類型,如果數(shù)據(jù)中沒有GUID類型的字符,則轉(zhuǎn)換正常,如果有,當進行GUID字符到INT的隱性轉(zhuǎn)換時,則轉(zhuǎn)換失敗。
以上就是本文的全部內(nèi)容,希望對大家進行SQL Server數(shù)據(jù)類型轉(zhuǎn)換有所幫助。
相關文章
mssql insert into 和insert into select性能比較
今天沒事,測了一下insert into和insert into select的性能,沒想到這兩個性能差別這么大。2010-03-03SQL order by ID desc/asc加一個排序的字段解決查詢慢問題
解決方法就是在order by ID desc再加一個排序的字段,這樣子可能會把速度提高很多,需要朋友可以試一下2012-12-12SQL Server創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表的相關約束實現(xiàn)方法
這篇文章主要介紹了SQL Server創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表的相關約束實現(xiàn)方法,以實例形式較為詳細的分析講述了數(shù)據(jù)庫約束的概念、功能、注意事項與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11SQL Server利用bcp命令把SQL語句結(jié)果生成文本文件
在SQL Server里可以調(diào)用DOS下的命令行工具bcp來實現(xiàn)把表里的數(shù)據(jù)或者SQL語句結(jié)果生成文本文件,詳細看下操作方法,感興趣的你可不要錯過了哈2013-02-02SQLServer行轉(zhuǎn)列實現(xiàn)思路記錄
SQLServer行轉(zhuǎn)列的sql語句有很多,可以使用靜態(tài)的、動態(tài)的、Case When等等,均能實現(xiàn)2014-06-06delete from 表名與truncate table 表名區(qū)別
delete from 表名與truncate table 表名區(qū)別,選擇適合我們的刪除數(shù)據(jù)庫數(shù)據(jù)的方法2012-10-10SQL?Server實現(xiàn)group_concat函數(shù)的詳細舉例
這篇文章主要給大家介紹了關于SQL?Server實現(xiàn)group_concat函數(shù)的詳細舉例,GROUP_CONCAT函數(shù)可以拼接某個字段值成字符串,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-11-11