Sql Server 2012 轉換函數的比較(Cast、Convert 和 Parse)

Cast、Convert 和 Parse 都是 Sql Server 2012 中的內置轉換函數,其作用是:一種資料類型轉換為另一種資料類型。其中前兩者的差別較小,但 Parse 為 Sql Server 2012 新增函數,也是最近在分析 Sql Server 2012 新特性的時間,才有想把這3個函數拿出來進行比較分析的想法。

語法結構:

1. Cast

語法結構:CAST ( expression AS data_type [ ( length ) ] )

2. Convert

語法結構:CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

3. Parse

語法結構:PARSE ( string_value AS data_type [ USING culture ] )

其中,Parse 為 Sql Server 的新特性 expression 必須要為被轉換類型的字串形式

總結:

1. Convert 和 Cast 的區別

CONVERT是專對SQL Server使用的,使日期與時間值,小數之間轉換具有更寬的靈活性。

CAST是兩種功能中更具ANSI標準的功能,即雖然更具便攜性(比如,使用CAST的函數能更容易的被其它資料庫軟體使用),但功能相對弱一些。不過,當小數轉化為數值,並保留原始運算式中的小數數值時,仍然需要使用CAST

2. Convert 和 Parse 的區別

兩者除了語法的區別,就是功能上面的區別,Convert 功能更強大,Parse 則為 Sql Server 2012 新增的功能,同時功能弱小很多的,只能將 字串 轉換為 數位類型 或者 日期類型,因為數位類型 或 日期類型長度都很小的,所以 Parse 所帶來的性能幾乎不可能有大的改變的,之後我也做了大量的比較,發現 Parse 是在絕大多數情況下都是可以替代的

3. 綜合比較

a. 如果 是做針對 Sql Server 的做開發,建議只用 Convert 方法

b. 如果考慮語句跨平臺,則儘量用 Cast,如 SQL 語句既能在 Sql Server 上執行,又能在 MySql 上面執行

c. Parse 在 Sql Server 2012 中就是一個雞肋,經過1 下午的實戰研究和翻閱MSDN,都沒有找到它的優勢,如果比語法,Cast 的語法結構和它一樣,如果比功能,又太弱小,完全不能和Cast 和 Convert 做比較,所以,您就把 Parse 忘記掉吧

性能分析所做的實驗:

1. Convert 和 Parse 轉換為字串的比較

DBCC FreeProcCache

set statistics profile on

select top 1 parse(name as Bigint) from test_Parse

select top 1 convert(Bigint,name) from test_Parse

其中 name 為 Nvarchar(1000) 的一個一段,值為:1231238912378912128

執行過之後,會發現,兩者的執行計畫完全相同,無論是對 CPU 的消耗,還是對 IO的消耗,沒有任何性能差別

2. Money 和 DateTime 類型的轉換比較

— DateTime

DBCC FreeProcCache

declare @date Varchar(100) = ‘2012/07/19 14:57:09.760’

select CONVERT(datetime,@date) as date

select Parse(@date as datetime using ‘zh-CN’) as date

–Money

SELECT PARSE(‘€345,98’ AS money USING ‘de-DE’) AS Result

Select Convert(money,’€345,98′,1) AS Result

3. Parse 的專利,字元型日期到 datetime 的轉換

SELECT PARSE(‘Monday, 13 December 2010’ AS datetime2 USING ‘en-US’) AS Result

SELECT PARSE(‘Monday, 13 December 2010’ AS datetime2 USING ‘zh-CN’) AS Result

— Cast 和 Convert 對這種類型的字串都是不支援的

–SELECT cast(‘Monday, 13 December 2010’ AS datetime2) AS Result

–SELECT Convert(datetime,’Monday, 13 December 2010′) AS Result

在性能方面同樣沒什麼區別,但是比較功能時,Parse 卻要比 Convert 錯太多