【SQL 編程你也行】SQL Server 2012新功能之函數:轉換函數

在SQL Server 2012中,新增了幾個轉換函數,用於支持數據類型的強制轉化。


由於之前主要用的是SQL Server 2008R2,而公司的項目爲了提高開發效率,很多表的列都爲varchar類型,但也會存儲數字。

 

當對這些列進行聚合計算,比如sum時,要先進行cast轉換爲numeric類型,經常會報錯,現在有了這些新的函數,可以先try一下,通過判斷返回值是否爲null,通過這個返回值,我們可以判斷字段值是否可以轉化爲數字,如果不是數字,就直接過濾掉,所以這些函數非常實用,也希望對大家有用。

1、PARSE函數
語法:PARSE ( string_value AS data_type [ USING culture ] )
參數:
string_value:nvarchar (4000) 值,表示要解析爲指定數據類型的格式化值。
string_value:必須爲所請求的數據類型的表示形式,否則 PARSE 將引發錯誤。
data_type    :表示結果的所請求數據類型的文本值。
culture         :可選字符串,它標識對 string_value 進行格式化的區域性。
                       如果未提供 culture 參數,則使用當前會話的語言。 可以使用 SET LANGUAGE 語句隱式或顯式設置                          此語言。 culture 接受 .NET Framework 支持的任何區域性;它不侷限於 SQL Server 顯式支持的語                            言。 如果culture 參數無效,PARSE 將引發錯誤。

例子:

--解析爲 日期
SELECT PARSE('2010年10月11日' AS datetime2 USING 'zh-CN') 
/*
2010-10-11 00:00:00.0000000
*/


--解析爲 美元
SELECT PARSE('$345.98' AS money USING 'en-US') 
/*
345.98
*/


--先設置要進行格式化的區域性,然後解析爲 日期
SET LANGUAGE '簡體中文';
SELECT PARSE('2010年10月11日' AS datetime) 
/*
2010-10-11 00:00:00.000
*/



2、TRY_CAST函數
返回轉換爲指定數據類型的值(如果轉換成功);否則返回 Null。
可以用來判斷指定值是否能轉化爲相應的數據類型,間接就可以知道值是什麼數據類型。
語法:TRY_CAST ( expression AS data_type [ ( length ) ] )
參數:
expression:要轉換的值。 任何有效的表達式。
data_type :要將 expression 轉換到的數據類型。
length       :指定目標數據類型長度的可選整數。可接受值的範圍由 data_type 的值確定。

 

例子:

 

--返回1,表示“.”是一個數字,這顯然是不對的
select isnumeric('.')


--轉換失敗
SELECT 
    CASE WHEN TRY_CAST('.' AS numeric(10,2)) IS NULL 
              THEN '轉換失敗'
		 ELSE '轉換成功'
	END


--轉換成功
SELECT 
    CASE WHEN TRY_CAST('1' AS numeric(10,2)) IS NULL 
              THEN '轉換失敗'
          ELSE '轉換成功'
    END


3、TRY_CONVERT函數

 

返回轉換爲指定數據類型的值(如果轉換成功);否則返回 Null。
可以用來判斷指定值是否能轉化爲相應的數據類型,間接就可以知道值是什麼數據類型。
語法:TRY_CONVERT ( data_type [ ( length ) ], expression [, style ] )
參數:
data_type [ ( length ) ]:要將 expression 轉換到的數據類型。
expression                  :  要轉換的值。
style                            :一個可選的整數表達式,指定 TRY_CONVERT 函數如何轉換 expression。style 接受與 CONVERT 函數的 style 參數相同的值。 可接受值的範圍由 data_type 的值確定。 如果 style爲 null,則TRY_CONVERT 返回 null。


例子:

--函數直接報錯,是因爲函數的寫法有問題
SELECT 
    CASE WHEN TRY_CONVERT(xml, 4) IS NULL 
              THEN '轉換失敗'
          ELSE '轉換成功'
    END
/*
消息 529,級別 16,狀態 2,第 2 行
不允許從數據類型 int 到 xml 的顯式轉換。
*/

 

--轉換失敗
SELECT 
    CASE WHEN TRY_CONVERT(float, 'a') IS NULL 
              THEN '轉換失敗'
          ELSE '轉換成功'
    END




--轉換成功
SELECT 
    CASE WHEN TRY_CONVERT(datetime, '20141201 13:12:11') IS NULL 
              THEN '轉換失敗'
         ELSE CONVERT(datetime, '20141201 13:12:11')   --轉換成功
    END




SELECT 
    CASE WHEN TRY_CONVERT(numeric(10,2),'1') IS NULL 
              THEN '轉換失敗'
         ELSE CONVERT(numeric(10,2),'1')
     END



4、TRY_PARSE函數
在 SQL Server 2012 中,返回表達式的結果(已轉換爲請求的數據類型);如果強制轉換失敗,則返回 Null。 

TRY_PARSE 僅用於從字符串轉換爲日期/時間和數字類型。

 

語法:TRY_PARSE ( string_value AS data_type [ USING culture ] )
參數:
string_value:nvarchar(4000) 值,表示要解析爲指定數據類型的格式化值。
string_value:必須爲所請求的數據類型的有效表示形式,否則 TRY_PARSE 將返回 Null。
data_type    :表示結果的所請求數據類型的文本。
culture:    可選字符串,它標識對 string_value 進行格式化的區域性。
如果未提供 culture 參數,則使用當前會話的語言。 可以使用 SET LANGUAGE 語句隱式或顯式設置此語言。 culture 接受 .NET Framework 支持的任何區域性;它不侷限於 SQL Server 顯式支持的語言。 如果culture 參數無效,PARSE 將引發錯誤。

例子:

SELECT
    CASE WHEN PARSE('2010年10月11日' AS datetime2 USING 'zh-CN') IS NULL
              THEN '失敗'
         ELSE '成功'
    END '轉化結果',
	PARSE('2010年10月11日' AS datetime2 USING 'zh-CN') '轉化後的值'
/*
轉化結果	轉化後的值
成功	2010-10-11 00:00:00.0000000
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章