sql2012增加Sequence对象

官方给出了一大堆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

 

下图可看出SequenceNumber最重要的功能是在多表间共享序列号

sql2012增加Sequence对象_第1张图片

 

 

2.通过修改Sequence将其初始值指定为一个特定值,

alter sequence sq_1 restart  with  100
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

 

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

你可能感兴趣的:(sql2012增加Sequence对象)