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