綠色(sè)資源網:您身邊最放心的安全下載站! 最新(xīn)軟件|熱門排行|軟件分類|軟件專(zhuān)題|廠商大全

綠色資(zī)源網

技術教程
您的位置:首(shǒu)頁數據(jù)庫類SQL Server → SQL Server2012對於開發(fā)人(rén)員用的上的新特性

SQL Server2012對於開發人(rén)員用的上的(de)新特性

我(wǒ)要(yào)評論 2013/04/01 18:40:36 來源(yuán):綠色資源網 編輯:www.ynaad.com [ 小(xiǎo)] 評論(lùn):0 點擊:277次

SQL Server 2012已經發布一(yī)段時間了,最近在(zài)新的機器上(shàng)安裝了最(zuì)新的SQL Server 2012 SP1,體檢下感覺良好。官方給出了一大堆SQL2012相對於SQL2008R2的新特性,但是(shì)大多數對於普通開發人員來說都是浮雲,根本用不到,下麵就說說一些(xiē)對於開發人員來(lái)說比較有(yǒu)用的新特性。

一、增加了Sequence對象:

這個對於Oracle用戶來說是最熟悉不過的數據庫對象了,現在在SQL Server中(zhōng)終於也看到了(le)類似的對象,隻是在使用的語法上有一點點不(bú)一樣。創建語法也是(shì)CREATE SEQUENCE,使用的時候需要使用NEXT VALUE FOR來取下一個值:

CREATE SEQUENCE [dbo].[SQ_1] 
 AS [bigint]
 START WITH 1
 INCREMENT BY 1;SELECT NEXT VALUE FOR [SQ_1] AS FirstUse;

如果要(yào)插入一個值,那麽就是:

INSERT INTO t1(c1,c2)
VALUES (NEXT VALUE FOR SQ_1, 'Test') ;

但是好像沒有提供獲得當前(qián)值的(de)語法,難道必須取下一個值?

二、新的分頁查(chá)詢語法(fǎ):

以前在(zài)SQL Server中分頁,最早是用top或(huò)者(zhě)臨時表,後來出現了ROW_NUMBER函數實現(xiàn)分頁,現在最新的SQL2012可以在(zài)order by子句後跟(gēn)offset和fetch來分頁,感覺有點像是LINQ的語法。比如查(chá)詢1W行之後的20條有效(xiào)項目信息,那麽ROW_NUMBER分頁查詢的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

而(ér)是有了新的語法,那麽查詢語(yǔ)句就是:

SELECT *
FROM PROJECT p
where p.IS_DELETED=0
ORDER BY p.PROJECT_ID 
OFFSET 10001 ROWS
FETCH NEXT 20 ROWS ONLY;

顯然使用了新的語法後代(dài)碼看起來(lái)更簡潔,意思表達也更明確。從執行效率上來講,試了一下,是一樣的。

三、一些新的係(xì)統函數:

3.1相當(dāng)於C#中三目運算符的IIF函數

這個函數和VBA中的IIF函數相同,判斷第一個參數的表達式是否為真,真則返回第二個參數,假則(zé)返回第三個參數。

有了這個函數很多時(shí)候我們可以不(bú)用再使用複雜的case when語法了。比如我們判(pàn)斷項(xiàng)目的大小(xiǎo)以顯示對應的字符(fú)串,那麽老的寫法是:

select p.CODE,case when p.SIZE>100 then 'Big' else 'Small' end as SIZE_STRING
from PROJECT p
where SIZE is not null

現在,我們可以簡單的寫成:

select p.CODE,IIF(p.SIZE>100,'Big','Small') as SIZE_STRING
from PROJECT p
where SIZE is not null

3.2不用判斷類(lèi)型和NULL的字符串連接CONCAT函數(shù)

SQL Server本來對字符串的連接很簡單,直接(jiē)使(shǐ)用“+”號(hào),但是需要注意兩個問題(tí),一是必須類型都是字符(fú)串類型,如果是數(shù)字類型那麽會報語法錯誤,所(suǒ)以(yǐ)必須把數字類型轉換為字符串。二是如果其中的某個值為null,那麽整個連接的結果就是一個null字(zì)符串,所以還需要判斷null,所以本來隻(zhī)是一個連接字符串的查詢就會寫的很複雜:

select p.PROJECT_ID, p.CODE+','+p.NAME+','+ISNULL(p.NICK_NAME,'')+','+ISNULL(CONVERT(varchar(50),p.SIZE),'')
from PROJECT p

現在使用(yòng)CONCAT函(hán)數,直接(jiē)忽略其中的類型,忽略對NULL的檢查,直接連(lián)接成一個非空的(de)字符串:

select p.PROJECT_ID,CONCAT( p.CODE,',',p.NAME,',',p.NICK_NAME,',',p.SIZE)
from PROJECT p

可以明顯(xiǎn)感覺到簡潔了很多。

3.3轉換成字符串時設置格式的FORMAT函(hán)數。

以前要把數字或者日(rì)期轉換成字符串,可以(yǐ)使用CONVERT函數並帶人第三個(gè)整數類型的(de)參數(shù)指定(dìng)轉換的格(gé)式(shì),不過這種(zhǒng)方法(fǎ)太麻煩,整數參數不容易理解和記憶,而(ér)且也不靈活。現在的FORMAT函數相當於C#中的(de)String.Format函(hán)數,在第二個參數中可以想要輸出的格式。

select p.PROJECT_ID,FORMAT(p.CREATED_TIME,'yyyy-MM-dd'),CONVERT(varchar(50),p.CREATED_TIME,112)
from PROJECT p

3.4讓枚舉顯示更方便(biàn)的CHOOSE函數。

在程序中經常使用枚舉值,在數據庫中使用tinyint來保存枚舉值,但是(shì)在查看時卻不是很容易理解(jiě)枚舉(jǔ)值的含義,必須查看代碼看1對應什麽(me),2對應什(shí)麽才知道。在顯示的時候(hòu)如果要顯示成字(zì)符串,那麽就需要使用case when進行判斷。現在可以(yǐ)使用CHOOSE函數,讓枚舉(jǔ)轉(zhuǎn)換成字符串(chuàn)變得很簡單。比如要顯示項目的狀態,那麽(me)我們的查詢就是:

select p.CODE,CHOOSE( p.STATUS,'Plan','Exec','Complete','Abort','Fail')
from PROJECT p

CHOSSE函數比case when有幾個缺點,1是不支持0和負數,所以如果枚舉的值是0那麽就沒辦法顯示,2是枚舉值必須連續而且比較小(xiǎo),不能使用(yòng)100、200等值,那要是用(yòng)CHOOSE那得寫死人了。沒有default值,使用case when的時候,如果不匹配(pèi)還有個else值可以顯示,而(ér)使用CHOOSE後如果沒有(yǒu)匹配的,那麽就是NULL值。所以個人覺得這個函數的(de)使用麵非常

3.5各種(zhǒng)日期時間函數。

除了一個(gè)EOMONTH函數是(shì)返回給定日期的最後一天(tiān)外,其他的新函數,都是把年月日作為參(cān)數傳(chuán)進去,返回指定數據類型的對象,相當於就是CONVERT函數的變形。總體使用不多,在此不多介紹。

四(sì)、OVER子句的增強和新增一些分(fèn)析函數:

之前OVER子句是用於RANK,ROW_NUMBER等排名函數,現在OVER子句得到了大(dà)大的增強, 可以將OVER子句應用到聚合函數中,也增加了一些分析函數。

比如(rú)我有一(yī)個項目(mù)和(hé)客戶表,一個客(kè)戶對於多個項目,現在(zài)需要知道(dào)客戶(hù)的信(xìn)息和每個客戶的最新項(xiàng)目Code,這個要是以前還不好實現,現在我們有了分析函數,可以使(shǐ)用(yòng)FIRST_VALUE或(huò)者LAST_VALUE再配合OVER子句,得到我(wǒ)們想要的(de)結(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

關鍵詞:SQL

閱讀本文後您有什麽感(gǎn)想? 已有 人給出評價!

  • 0 歡(huān)迎喜歡
  • 0 白癡
  • 0 拜托
  • 0 哇
  • 0 加油
  • 0 鄙視(shì)
免费人欧美成又黄又爽的视频丨一本色道久久88综合日韩精品丨国产专区日韩精品欧美色丨午夜无遮挡男女啪啪视频丨国产欧美日韩综合精品一区二区丨亚洲精品无码不卡在线播HE丨亚洲精品国产精品国自产观看丨日韩国产高清av不卡