[SQL SERVER][Denali] TSQL 新特性(下)

[SQL SERVER][Denali] TSQL 新特性(下)

Denali 在開發方面的改善和新特性還算不少,可惜我沒太多時間好好深入研究,

所以撰寫 Denali 新特性一系列文章大部分都處於夢周公神遊狀態(半夢半醒...XD),

如果相關文章內容有錯還請告知,接下來我繼續補充其他我個人感興趣的TSQL新特性。

 

EOMONTH (Transact-SQL):取得月份最後一天

以往你要取得某個月份最後一天,大概都會利用 dateadd 和 day 兩個function 去湊出正確結果,

現在,Eomonth function 免去你拼拼湊湊的煩惱。

 

declare @mydate datetime
set @mydate = '2011-10-11'
--using eomonth function
select eomonth (@mydate)   
--using dateadd and day function 
select dateadd(mm,1,@mydate - day(@mydate)+1)-1

 

 

image

 

CONCAT (Transact-SQL):返回兩個或多個連接字串結果。

以往我們都使用 + 來連接字串,但遇到非字串類型一定得自行轉換為字串類型才可,

現在,Concat function 免去你不同資料類型連接問題。

image

image

concat function 不須自行處理資料類型轉換也行得通喔。

 

image

image

遇到int 資料類型,使用 + 串接會出現轉換失敗。

 

FORMAT (Transact-SQL):返回所指定的格式和文化特性。

我終於看到Format function了,現在你可以輕鬆指定相關資料類型格式了。

文化特性可查看National Language Support (NLS) API Reference

image

擷取部分。

 

declare @mydate datetime=getdate()
select concat(format(@mydate,'yyyy/MM/dd','zh-TW'),' -- ',format(@mydate,'d','zh-TW'))
select concat(format(@mydate,'yyyy/MM/dd','co'),' -- ',format(@mydate,'d','co' ))
select concat(format(@mydate,'yyyy/MM/dd','ga'),' -- ',format(@mydate,'d','ga' ))
select concat(format(@mydate,'yyyy/MM/dd','en-us'),' -- ',format(@mydate,'d','en-us' ))

 

 

image

 

CHOOSE (Transact-SQL):依索引(1~N)返回清單中所對應項目內容。

image

 

這裡我順便和 Case 來比較測試一下效能是否有很大差異。

 

Choose

select CustomerID,AccountNumber=choose(TerritoryID,'rico','papa','dou','dada','sasa') 
from Sales.Customer

 

 

image

image

 

Case

select CustomerID,AccountNumber=
case 
    when TerritoryID=1 then 'rico' 
    when TerritoryID=2 then 'papa' 
    when TerritoryID=3 then 'dou' 
    when TerritoryID=4 then 'dada' 
    when TerritoryID=5 then 'sasa' 
end    
from Sales.Customer 

 

 

 

image

image

 

效能結果比較表

Function CPU 時間(ms) 經過時間(ms) 執行計畫總成本
Choose 15 156 0.522512
Case 0 137 0.522512

 

可以看到使用 Choose CPU時間較耗時(使用較多CPU資源),

經過時間Choose也較耗時,但兩個Function執行計畫總成本一樣,

看來兩者整體上的效能應該差距不大。

 

IIF (Transact-SQL):依布林運算式結果返回對應內容。

image

 

和Case比較測試一下效能是否有很大差異。

iif

select CustomerID,
AccountNumber=iif(TerritoryID=4,'My name is rico',AccountNumber) 
from Sales.Customer

 

 

image

image

看來 iif 骨子裡也是 case when。

 

image

 

Case

select CustomerID,AccountNumber=
case 
    when TerritoryID=4 then 'My name is rico' 
    else AccountNumber 
end    
from Sales.Customer 

 

 

image

image

image

 

效能結果比較表

Function CPU 時間(ms) 經過時間(ms) 執行計畫總成本
IIF 78 141 0.0542332
Case 109 166 0.0542335

 

可以看到使用 IIF CPU時間較不耗時,

經過時間IIF也較不耗時,但兩個Function執行計畫總成本一樣,

看來兩者整體上的效能應該差距不大。

 

注意:

@對於相關新增的function目前版本都會顯示為不可辨識的內建函數名稱,

等到RTM時這紅色小蚯蚓應該會消失。