SEQUENCE
序列是用户定义的绑定到架构的对象,该对象可根据创建序列所依据的规范来生成数值序列。这组数值以定义的间隔按升序或降序生成,并且可配置为用尽时重新启动(循环)。 序列不与特定表相关联,这一点与标识列不同.
语法:
CREATE SEQUENCE [schema_name . ] sequence_name --序列对象名
[ AS [ built_in_integer_type | user-defined_integer_type ] ] --整型(默认bigint)
[ START WITH <constant> ] --开始值(大于等于最小值,小于等于最大值)
[ INCREMENT BY <constant> ]---增量
[ { MINVALUE [ <constant> ] } | { NO MINVALUE } ] --最小值
[ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ] --最大值
[ CYCLE | { NO CYCLE } ] --是否循环
[ { CACHE [ <constant> ] } | { NO CACHE } ] --缓存
[ ; ]
示例:创建一个序列对象
CREATE SEQUENCE LTH.DecSeq
AS decimal(3,0)--类型为decimal 3位有效数字,小数位为0
START WITH 125--从125开始生成
INCREMENT BY 25--每次增量为25
MINVALUE 100--最小值:100
MAXVALUE 200--最大值:200
CYCLE--可循环
CACHE 3--缓存3
生成序列函数:NEXT VALUE FOR LTH.DecSeq;没错,它就是一个函数,可以用来生成下一个序列号
SELECT NEXT VALUE FOR LTH.DecSeq;--return 125
查询当前序列号,表sys.sequences
SELECT current_value
FROM sys.sequences
where OBJECT_ID=OBJECT_ID('LTH.DecSeq','SO');--return 125
关于生成标识的NEXT VALUE FOR 函数说明
语法:
NEXT VALUE FOR [ database_name . ] [ schema_name . ] sequence_name
[ OVER (<over_order_by_clause>) ] --这个OVER子句类似开窗函数
仔细看一下MSDN中的一段说明
1.在查询或默认约束中使用 NEXT VALUE FOR 函数时,如果多次使用相同的序列对象,或者在提供这些值的语句以及执行的默认约束中使用相同的序列对象,则为结果集的行中引用同一序列的所有列返回相同的值。
说明:注意这里的行中两个字,就是说,在同一段语句中同时执行同一个对象,行中的多个列会生产相同的值。
示例:调用了NEXT VALUE FOR LTH.DecSeq 两次,生成了相同的值125
SELECT NEXT VALUE FOR LTH.DecSeq AS col1,
NEXT VALUE FOR LTH.DecSeq AS col2
FROM LTH.t6;
--返回结果
col1 col2
--------------------------------------- ---------------------------------------
125 125
2.序列与排名函数一起使用
示例:根据lastname的排名生成序列号,注意展示数据无序,不受此order by 影响
SELECT NEXT VALUE FOR LTH.CountBy1 OVER(ORDER BY lastname) AS col1,
firstname,lastname
FROM Person.Person
3.NEXT VALUE FOR 做默认约束
示例:
CREATE TABLE LTH.Mytable
(
id INT PRIMARY KEY ,
name VARCHAR(20) NOT NULL
);
--修改表添加约束
ALTER TABLE LTH.Mytable--修改表,添加约束
ADD CONSTRAINT DFT_id
DEFAULT(NEXT VALUE FOR LTH.CountBy1)--定义默认值为NEXT VALUE FOR 函数生成标识值
FOR id;
--插入值
INSERT INTO LTH.Mytable(name) VALUES('LTH');--默认生成标识
INSERT INTO LTH.Mytable(id,name)VALUES(NEXT VALUE FOR LTH.CountBy1,'lth2');--调用函数生成
SELECT * FROM LTH.Mytable
返回结果:
id name
----------- --------------------
19975 LTH
19976 lth2
4.NEXT VALUE FOR 在update 语句中的应用
示例:Mytable中原有两条记录,ID分别为19975,19976,用UPDATE语句调用NEXT VALUE FOR 函数修改后每行ID在原有最大值上逐渐递增19977,19976
UPDATE LTH.Mytable SET id=NEXT VALUE FOR LTH.CountBy1
WHERE ID>=19975
SELECT * FROM LTH.Mytable
--返回结果:
id name
----------- --------------------
19977 LTH
19978 lth2
最后,MSDN中还有一段话我觉得它是对序列函数很好的一个总结:NEXT VALUE FOR 函数具有不确定性,只允许在明确定义了生成的序列值数目的上下文中使用。SELECT,UPDATE,INSERT VALUES,SELECT INTO,过程化的语句(比如,declare,set)