SQL Server2012對(duì)于開發(fā)人員用的上的新特性
SQL Server 2012已經(jīng)發(fā)布一段時(shí)間了,最近在新的機(jī)器上安裝了最新的SQL Server 2012 SP1,體檢下感覺良好。官方給出了一大堆SQL2012相對(duì)于SQL2008R2的新特性,但是大多數(shù)對(duì)于普通開發(fā)人員來(lái)說(shuō)都是浮云,根本用不到,下面就說(shuō)說(shuō)一些對(duì)于開發(fā)人員來(lái)說(shuō)比較有用的新特性。
一、增加了Sequence對(duì)象:
這個(gè)對(duì)于Oracle用戶來(lái)說(shuō)是最熟悉不過(guò)的數(shù)據(jù)庫(kù)對(duì)象了,現(xiàn)在在SQL Server中終于也看到了類似的對(duì)象,只是在使用的語(yǔ)法上有一點(diǎn)點(diǎn)不一樣。創(chuàng)建語(yǔ)法也是CREATE SEQUENCE,使用的時(shí)候需要使用NEXT VALUE FOR來(lái)取下一個(gè)值:
CREATE SEQUENCE [dbo].[SQ_1] AS [bigint] START WITH 1 INCREMENT BY 1; SELECT NEXT VALUE FOR [SQ_1] AS FirstUse;
如果要插入一個(gè)值,那么就是:
INSERT INTO t1(c1,c2) VALUES (NEXT VALUE FOR SQ_1, 'Test') ;
但是好像沒有提供獲得當(dāng)前值的語(yǔ)法,難道必須取下一個(gè)值?
二、新的分頁(yè)查詢語(yǔ)法:
以前在SQL Server中分頁(yè),最早是用top或者臨時(shí)表,后來(lái)出現(xiàn)了ROW_NUMBER函數(shù)實(shí)現(xiàn)分頁(yè),現(xiàn)在最新的SQL2012可以在order by子句后跟offset和fetch來(lái)分頁(yè),感覺有點(diǎn)像是LINQ的語(yǔ)法。比如查詢1W行之后的20條有效項(xiàng)目信息,那么ROW_NUMBER分頁(yè)查詢的SQL是:
select * from ( select *,ROW_NUMBER() over(order by p.PROJECT_ID) R from PROJECT p where p.IS_DELETED=0 ) x where x.R between 10001 and 10020
而是有了新的語(yǔ)法,那么查詢語(yǔ)句就是:
SELECT * FROM PROJECT p where p.IS_DELETED=0 ORDER BY p.PROJECT_ID OFFSET 10001 ROWS FETCH NEXT 20 ROWS ONLY;
顯然使用了新的語(yǔ)法后代碼看起來(lái)更簡(jiǎn)潔,意思表達(dá)也更明確。從執(zhí)行效率上來(lái)講,試了一下,是一樣的。
三、一些新的系統(tǒng)函數(shù):
3.1相當(dāng)于C#中三目運(yùn)算符的IIF函數(shù)
這個(gè)函數(shù)和VBA中的IIF函數(shù)相同,判斷第一個(gè)參數(shù)的表達(dá)式是否為真,真則返回第二個(gè)參數(shù),假則返回第三個(gè)參數(shù)。
有了這個(gè)函數(shù)很多時(shí)候我們可以不用再使用復(fù)雜的case when語(yǔ)法了。比如我們判斷項(xiàng)目的大小以顯示對(duì)應(yīng)的字符串,那么老的寫法是:
select p.CODE,case when p.SIZE>100 then 'Big' else 'Small' end as SIZE_STRING from PROJECT p where SIZE is not null
現(xiàn)在,我們可以簡(jiǎn)單的寫成:
select p.CODE,IIF(p.SIZE>100,'Big','Small') as SIZE_STRING from PROJECT p where SIZE is not null
3.2不用判斷類型和NULL的字符串連接CONCAT函數(shù)
SQL Server本來(lái)對(duì)字符串的連接很簡(jiǎn)單,直接使用“+”號(hào),但是需要注意兩個(gè)問(wèn)題,一是必須類型都是字符串類型,如果是數(shù)字類型那么會(huì)報(bào)語(yǔ)法錯(cuò)誤,所以必須把數(shù)字類型轉(zhuǎn)換為字符串。二是如果其中的某個(gè)值為null,那么整個(gè)連接的結(jié)果就是一個(gè)null字符串,所以還需要判斷null,所以本來(lái)只是一個(gè)連接字符串的查詢就會(huì)寫的很復(fù)雜:
select p.PROJECT_ID, p.CODE+','+p.NAME+','+ISNULL(p.NICK_NAME,'')+','+ISNULL(CONVERT(varchar(50),p.SIZE),'') from PROJECT p
現(xiàn)在使用CONCAT函數(shù),直接忽略其中的類型,忽略對(duì)NULL的檢查,直接連接成一個(gè)非空的字符串:
select p.PROJECT_ID,CONCAT( p.CODE,',',p.NAME,',',p.NICK_NAME,',',p.SIZE) from PROJECT p
可以明顯感覺到簡(jiǎn)潔了很多。
3.3轉(zhuǎn)換成字符串時(shí)設(shè)置格式的FORMAT函數(shù)。
以前要把數(shù)字或者日期轉(zhuǎn)換成字符串,可以使用CONVERT函數(shù)并帶人第三個(gè)整數(shù)類型的參數(shù)指定轉(zhuǎn)換的格式,不過(guò)這種方法太麻煩,整數(shù)參數(shù)不容易理解和記憶,而且也不靈活?,F(xiàn)在的FORMAT函數(shù)相當(dāng)于C#中的String.Format函數(shù),在第二個(gè)參數(shù)中可以想要輸出的格式。
select p.PROJECT_ID,FORMAT(p.CREATED_TIME,'yyyy-MM-dd'),CONVERT(varchar(50),p.CREATED_TIME,112) from PROJECT p
3.4讓枚舉顯示更方便的CHOOSE函數(shù)。
在程序中經(jīng)常使用枚舉值,在數(shù)據(jù)庫(kù)中使用tinyint來(lái)保存枚舉值,但是在查看時(shí)卻不是很容易理解枚舉值的含義,必須查看代碼看1對(duì)應(yīng)什么,2對(duì)應(yīng)什么才知道。在顯示的時(shí)候如果要顯示成字符串,那么就需要使用case when進(jìn)行判斷。現(xiàn)在可以使用CHOOSE函數(shù),讓枚舉轉(zhuǎn)換成字符串變得很簡(jiǎn)單。比如要顯示項(xiàng)目的狀態(tài),那么我們的查詢就是:
select p.CODE,CHOOSE( p.STATUS,'Plan','Exec','Complete','Abort','Fail') from PROJECT p
CHOSSE函數(shù)比case when有幾個(gè)缺點(diǎn),1是不支持0和負(fù)數(shù),所以如果枚舉的值是0那么就沒辦法顯示,2是枚舉值必須連續(xù)而且比較小,不能使用100、200等值,那要是用CHOOSE那得寫死人了。沒有default值,使用case when的時(shí)候,如果不匹配還有個(gè)else值可以顯示,而使用CHOOSE后如果沒有匹配的,那么就是NULL值。所以個(gè)人覺得這個(gè)函數(shù)的使用面非常
3.5各種日期時(shí)間函數(shù)。
除了一個(gè)EOMONTH函數(shù)是返回給定日期的最后一天外,其他的新函數(shù),都是把年月日作為參數(shù)傳進(jìn)去,返回指定數(shù)據(jù)類型的對(duì)象,相當(dāng)于就是CONVERT函數(shù)的變形。總體使用不多,在此不多介紹。
四、OVER子句的增強(qiáng)和新增一些分析函數(shù):
之前OVER子句是用于RANK,ROW_NUMBER等排名函數(shù),現(xiàn)在OVER子句得到了大大的增強(qiáng), 可以將OVER子句應(yīng)用到聚合函數(shù)中,也增加了一些分析函數(shù)。
比如我有一個(gè)項(xiàng)目和客戶表,一個(gè)客戶對(duì)于多個(gè)項(xiàng)目,現(xiàn)在需要知道客戶的信息和每個(gè)客戶的最新項(xiàng)目Code,這個(gè)要是以前還不好實(shí)現(xiàn),現(xiàn)在我們有了分析函數(shù),可以使用FIRST_VALUE或者LAST_VALUE再配合OVER子句,得到我們想要的結(jié)果:
select distinct c.*,FIRST_VALUE(p.CODE) over(PARTITION BY c.CLIENT_ID order by p.[CREATED_TIME] desc) as LAST_PROJECT_CODE from PROJECT p inner join CLIENT c on p.CLIENT_ID=c.CLIENT_ID
關(guān)鍵詞:SQL
閱讀本文后您有什么感想? 已有 人給出評(píng)價(jià)!
- 0
- 0
- 0
- 0
- 0
- 0