官方給出了一大堆SQL2012相對於SQL2008R2的新特性,但是大多數對於普通開發人員來說都是浮雲,根本用不到,下面就說說一些對於開發人員來說比較有用的新特性。
Sequence對象對於Oracle用戶來說是最熟悉不過的數據庫對象了,現在在SQL Server中終於也看到了類似的對象,只是在使用的語法上有一點點不一樣。創建語法也是CREATE SEQUENCE,使用的時候需要使用NEXT VALUE FOR來取下一個值:
1.用法
create sequence sq_1
as bigint
start with 1
increment by 1;
select next value for sq_1 -- as firstuse;
insert into TestSequence_seq(seq_id,seq_value) values( next value for sq_1 , ' test ');
insert into TestSequence_seq(seq_id,seq_value) values( next value for sq_1 , ' test ');
insert into TestSequence_seq(seq_id,seq_value) values( next value for sq_1 , ' test ');
insert into TestSeq(seq_id,seq_value) values( next value for sq_1 , ' test ');
insert into TestSequence_seq(seq_id,seq_value) values( next value for sq_1 , ' test ');
select * from TestSequence_seq
select * from TestSeq
select name,type_Desc,start_value,increment,minimum_value,maximum_value,current_value,is_cached from sys.sequences
as bigint
start with 1
increment by 1;
select next value for sq_1 -- as firstuse;
insert into TestSequence_seq(seq_id,seq_value) values( next value for sq_1 , ' test ');
insert into TestSequence_seq(seq_id,seq_value) values( next value for sq_1 , ' test ');
insert into TestSequence_seq(seq_id,seq_value) values( next value for sq_1 , ' test ');
insert into TestSeq(seq_id,seq_value) values( next value for sq_1 , ' test ');
insert into TestSequence_seq(seq_id,seq_value) values( next value for sq_1 , ' test ');
select * from TestSequence_seq
select * from TestSeq
select name,type_Desc,start_value,increment,minimum_value,maximum_value,current_value,is_cached from sys.sequences
下圖可看出SequenceNumber最重要的功能是在多表間共享序列號

2.通過修改Sequence將其初始值指定為一個特定值,
alter sequence sq_1 restart
with
100
select next value for sq_1
select next value for sq_1

3.Sequence一個需要注意的情況是Sequence只負責生成序列號,而不管序列號如何使用,如果事務不成功或回滾,SequenceNumber仍然會繼續向后生成序列號,
alter sequence sq_1 restart
with
200
--
重置為200
begin tran
insert into TestSeq(seq_id,seq_value) values( next value for sq_1 , ' test ');
rollback -- 雖然事務回滾,但序號仍然向后加1
select next value for sq_1
begin tran
insert into TestSeq(seq_id,seq_value) values( next value for sq_1 , ' test ');
rollback -- 雖然事務回滾,但序號仍然向后加1
select next value for sq_1

4.還可以為Sequence指定緩存選項,使得減少IO,比如,我們指定Cache選項為4,則當前的Sequence由1增長過4后,SQL Server會再分配4個空間變為從5到8,當分配到9時,SQL Server繼續這以循環,如果不指定Cache值,則值由SQL Server進行分配。
create sequence sq_1
as bigint
start with 1
increment by 1
cache 5;
select name,type_Desc,start_value,increment,minimum_value,maximum_value,current_value,cache_size from sys.sequences
as bigint
start with 1
increment by 1
cache 5;
select name,type_Desc,start_value,increment,minimum_value,maximum_value,current_value,cache_size from sys.sequences
CACHE n 一次就放入內存n個值。默認值為20,如果你要連續的使用序列,如定單流水號的產生,請將N設大點。如果你不使用序列,而是自己寫代碼,請注意你的程序效率和競爭鎖死情況的發生。
停止數據庫后,內存中存放的序列值會丟失
使用序列的原則如下:
如果你想用做主鍵,請使用不可循環的序列。
如果想快速發生序列的值,請將cache的值加大。
如果序列內的值要很長時間才能使用完,可以考慮使用可以循環的序列。
