在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
*/