SQL Server數(shù)據(jù)類型轉(zhuǎn)換方法
在SQL Server日常的函數(shù)、存儲(chǔ)過程和SQL語句中,經(jīng)常會(huì)用到不同數(shù)據(jù)類型的轉(zhuǎn)換。在SQL Server有兩種數(shù)據(jù)轉(zhuǎn)換類型:一種是顯性數(shù)據(jù)轉(zhuǎn)換;另一種是隱性數(shù)據(jù)轉(zhuǎn)換。下面分別對(duì)這兩種數(shù)據(jù)類型轉(zhuǎn)換進(jìn)行簡(jiǎn)要的說明:
1 顯式轉(zhuǎn)換
顯示轉(zhuǎn)換是將某種數(shù)據(jù)類型的表達(dá)式顯式轉(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表達(dá)式。data_type 目標(biāo)系統(tǒng)所提供的數(shù)據(jù)類型,不能使用用戶定義的數(shù)據(jù)類型。
2 隱性轉(zhuǎn)換
隱性轉(zhuǎn)換對(duì)于用戶是不可見的,由SQL Server 引擎自動(dòng)處理。 隱性轉(zhuǎn)換自動(dòng)將數(shù)據(jù)從一種數(shù)據(jù)類型轉(zhuǎn)換成另一種數(shù)據(jù)類型。例如,如果一個(gè) smallint 變量和一個(gè) int 變量相比較,這個(gè) smallint 變量在比較前即被隱性轉(zhuǎn)換成 int 變量。 當(dāng)從一個(gè) SQL Server 對(duì)象的數(shù)據(jù)類型向另一個(gè)轉(zhuǎn)換時(shí),一些隱性和顯式數(shù)據(jù)類型轉(zhuǎn)換是不支持的。例如,nchar 數(shù)值根本就不能被轉(zhuǎn)換成 image 數(shù)值。nchar 只能顯式地轉(zhuǎn)換成 binary,隱性地轉(zhuǎn)換到 binary 是不支持的。nchar 可以顯式地或者隱性地轉(zhuǎn)換成 nvarchar。
3 隱性轉(zhuǎn)換的風(fēng)險(xiǎn)
隱性轉(zhuǎn)換有的時(shí)候非常方便,可以簡(jiǎn)化SQL 腳本,但是這里面也孕育著潛在的風(fēng)險(xiǎn),可能會(huì)出現(xiàn)在腳本一開始運(yùn)行的時(shí)候都是正常的,但卻某一個(gè)時(shí)間點(diǎn)之后,程序莫名出現(xiàn)錯(cuò)誤。下面舉一個(gè)現(xiàn)實(shí)項(xiàng)目中的例子來說明。在SQL Server 2008中有一個(gè)表,需要從兩個(gè)不同的數(shù)據(jù)表中拉取數(shù)據(jù),由于這兩個(gè)數(shù)據(jù)表屬于不同的系統(tǒng),其主鍵類型是不同的,一個(gè)是int類型,一個(gè)是GUID,一開始想著這兩個(gè)都可以轉(zhuǎn)換成字符類型進(jìn)行存儲(chǔ)。所以就在表中建立一個(gè)nvarchar(50)的混合ID列作為主鍵。如下圖所示:

一開始拉取的數(shù)據(jù)并未有GUID的值,都是INT類型轉(zhuǎn)換過來的數(shù)據(jù),所以SQL腳本運(yùn)行的正常,但是突然某一次運(yùn)行時(shí),出現(xiàn)了“在將 nvarchar 值 '4C185367-F004-41FE-8A0A-DB4E819B1FF2' 轉(zhuǎn)換成數(shù)據(jù)類型 int 時(shí)失敗?!钡腻e(cuò)誤。如下圖所示:

定位到腳本,執(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 序號(hào)='2' select * from dbo.Demo where 混合ID=305 and 序號(hào)=2 select * from dbo.Demo where 混合ID='305' and 名稱='INT' select * from dbo.Demo where 混合ID='305'
結(jié)果如下:

出現(xiàn)上述錯(cuò)誤的結(jié)果應(yīng)該是這樣的:
select * from dbo.Demo where 混合ID=305在執(zhí)行時(shí),SQL Server會(huì)將nvarchar類型的隱性轉(zhuǎn)換成int類型,如果數(shù)據(jù)中沒有GUID類型的字符,則轉(zhuǎn)換正常,如果有,當(dāng)進(jìn)行GUID字符到INT的隱性轉(zhuǎn)換時(shí),則轉(zhuǎn)換失敗。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家進(jìn)行SQL Server數(shù)據(jù)類型轉(zhuǎn)換有所幫助。
相關(guān)文章
SQL Server中將查詢結(jié)果轉(zhuǎn)換為Json格式腳本分享
這篇文章主要介紹了SQL Server中將查詢結(jié)果轉(zhuǎn)換為Json格式腳本分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-02-02
SQL中Group分組獲取Top N方法實(shí)現(xiàn)可首選row_number
統(tǒng)計(jì)每個(gè)城市的最新10個(gè)產(chǎn)品本文采用了游標(biāo)方法/Count查詢/cross apply方法/row_number方法等等對(duì)比不難發(fā)現(xiàn)Group獲取Top N場(chǎng)景時(shí),可以首選row_number,游標(biāo)cursor其次,另外兩個(gè)就基本不考慮了2013-03-03
SQL?Server數(shù)據(jù)庫連接查詢和子查詢實(shí)戰(zhàn)案例
子查詢(嵌套查詢)子查詢也稱嵌套查詢,是指一個(gè)SELECT查詢語句可以嵌入另一個(gè)SELECT查詢語句之中,下面這篇文章主要給大家介紹了關(guān)于SQL?Server數(shù)據(jù)庫連接查詢和子查詢的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
SQL Server 數(shù)據(jù)庫管理常用的SQL和T-SQL語句
SQL Server 數(shù)據(jù)庫管理常用的SQL和T-SQL語句...2007-03-03
ODBC連接數(shù)據(jù)庫以SQLserver為例圖文詳解
開放數(shù)據(jù)庫互連(ODBC)是微軟提出的數(shù)據(jù)庫訪問接口標(biāo)準(zhǔn),開放數(shù)據(jù)庫互連定義了訪問數(shù)據(jù)庫的API一個(gè)規(guī)范,這些API獨(dú)立于不同廠商的DBMS,也獨(dú)立于具體的編程語言,下面這篇文章主要給大家介紹了關(guān)于ODBC連接數(shù)據(jù)庫以SQLserver為例的相關(guān)資料,需要的朋友可以參考下2023-05-05
jdbc使用PreparedStatement批量插入數(shù)據(jù)的方法
這篇文章主要介紹了jdbc使用PreparedStatement批量插入數(shù)據(jù)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
MSSQL數(shù)據(jù)庫占用內(nèi)存過大造成服務(wù)器死機(jī)問題的解決方法
有時(shí)候我們的服務(wù)器使用MSSQL數(shù)據(jù)庫,但如果MSSQL數(shù)據(jù)庫占用內(nèi)存過大可能導(dǎo)致服務(wù)器死機(jī),這里分享下解決方法, 需要的朋友可以參考下2013-07-07

