SQL Server 已經發布一段時間了最近在新的機器上安裝了最新的SQL Server SP體檢下感覺良好官方給出了一大堆SQL相對於SQLR的新特性但是大多數對於普通開發人員來說都是浮雲根本用不到下面就說說一些對於開發人員來說比較有用的新特性
一增加了Sequence對象
這個對於Oracle用戶來說是最熟悉不過的數據庫對象了現在在SQL Server中終於也看到了類似的對象只是在使用的語法上有一點點不一樣創建語法也是CREATE SEQUENCE使用的時候需要使用NEXT VALUE FOR來取下一個值
CREATE SEQUENCE [dbo][SQ_]
AS [bigint]
START WITH
INCREMENT BY ;
SELECT NEXT VALUE FOR [SQ_] AS FirstUse;
如果要插入一個值那麼就是
INSERT INTO t(cc)
VALUES (NEXT VALUE FOR SQ_ Test) ;
但是好像沒有提供獲得當前值的語法難道必須取下一個值?
二新的分頁查詢語法
以前在SQL Server中分頁最早是用top或者臨時表後來出現了ROW_NUMBER函數實現分頁現在最新的SQL可以在order by子句後跟offset和fetch來分頁感覺有點像是LINQ的語法比如查詢W行之後的條有效項目信息那麼ROW_NUMBER分頁查詢的SQL是
select *
from
(
select *ROW_NUMBER() over(order by pPROJECT_ID) R
from PROJECT p
where pIS_DELETED=
) x
where xR between and
而是有了新的語法那麼查詢語句就是
SELECT *
FROM PROJECT p
where pIS_DELETED=
ORDER BY pPROJECT_ID
OFFSET ROWS
FETCH NEXT ROWS ONLY;
顯然使用了新的語法後代碼看起來更簡潔意思表達也更明確從執行效率上來講試了一下是一樣的
三一些新的系統函數
相當於C#中三目運算符的IIF函數
這個函數和VBA中的IIF函數相同判斷第一個參數的表達式是否為真真則返回第二個參數假則返回第三個參數
有了這個函數很多時候我們可以不用再使用復雜的case when語法了比如我們判斷項目的大小以顯示對應的字符串那麼老的寫法是
select pCODEcase when pSIZE> then Big else Small end as SIZE_STRING
from PROJECT p
where SIZE is not null
現在我們可以簡單的寫成
select pCODEIIF(pSIZE>BigSmall) as SIZE_STRING
from PROJECT p
where SIZE is not null
不用判斷類型和NULL的字符串連接CONCAT函數
SQL Server本來對字符串的連接很簡單直接使用“+”號但是需要注意兩個問題一是必須類型都是字符串類型如果是數字類型那麼會報語法錯誤所以必須把數字類型轉換為字符串二是如果其中的某個值為null那麼整個連接的結果就是一個null字符串所以還需要判斷null所以本來只是一個連接字符串的查詢就會寫的很復雜
select pPROJECT_ID pCODE++pNAME++ISNULL(pNICK_NAME)++ISNULL(CONVERT(varchar()pSIZE))
from PROJECT p
現在使用CONCAT函數直接忽略其中的類型忽略對NULL的檢查直接連接成一個非空的字符串
select pPROJECT_IDCONCAT( pCODEpNAMEpNICK_NAMEpSIZE)
from PROJECT p
可以明顯感覺到簡潔了很多
轉換成字符串時設置格式的FORMAT函數
以前要把數字或者日期轉換成字符串可以使用CONVERT函數並帶人第三個整數類型的參數指定轉換的格式不過這種方法太麻煩整數參數不容易理解和記憶而且也不靈活現在的FORMAT函數相當於C#中的StringFormat函數在第二個參數中可以想要輸出的格式
select pPROJECT_IDFORMAT(pCREATED_TIMEyyyyMMdd)CONVERT(varchar()pCREATED_TIME)
from PROJECT p
讓枚舉顯示更方便的CHOOSE函數
在程序中經常使用枚舉值在數據庫中使用tinyint來保存枚舉值但是在查看時卻不是很容易理解枚舉值的含義必須查看代碼看對應什麼對應什麼才知道在顯示的時候如果要顯示成字符串那麼就需要使用case when進行判斷現在可以使用CHOOSE函數讓枚舉轉換成字符串變得很簡單比如要顯示項目的狀態那麼我們的查詢就是
select pCODECHOOSE( pSTATUSPlanExecCompleteAbortFail)
from PROJECT p
CHOSSE函數比case when有幾個缺點是不支持和負數所以如果枚舉的值是那麼就沒辦法顯示是枚舉值必須連續而且比較小不能使用等值那要是用CHOOSE那得寫死人了沒有default值使用case when的時候如果不匹配還有個else值可以顯示而使用CHOOSE後如果沒有匹配的那麼就是NULL值所以個人覺得這個函數的使用面非常
各種日期時間函數
除了一個EOMONTH函數是返回給定日期的最後一天外其他的新函數都是把年月日作為參數傳進去返回指定數據類型的對象相當於就是CONVERT函數的變形總體使用不多在此不多介紹
四OVER子句的增強和新增一些分析函數
之前OVER子句是用於RANKROW_NUMBER等排名函數現在OVER子句得到了大大的增強 可以將OVER子句應用到聚合函數中也增加了一些分析函數
比如我有一個項目和客戶表一個客戶對於多個項目現在需要知道客戶的信息和每個客戶的最新項目Code這個要是以前還不好實現現在我們有了分析函數可以使用FIRST_VALUE或者LAST_VALUE再配合OVER子句得到我們想要的結果
select distinct c*FIRST_VALUE(pCODE) over(PARTITION BY cCLIENT_ID order by p[CREATED_TIME] desc) as LAST_PROJECT_CODE
from PROJECT p
inner join CLIENT c
on pCLIENT_ID=cCLIENT_ID
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22275.html