之前场景下,要求先去数据 Max()然后加1 分成两部操作,可以可以一步完成
——————————————————————————
序列是通过使用 CREATE SEQUENCE 语句独立于表来创建的。 其选项使您可以控制增量、最大值和最小值、起始点、自动重新开始功能和缓存以便改进性能。 有关这些选项的信息,请参阅 CREATE SEQUENCE。
与在插入行时生成的标识列值不同,应用程序可以通过调用 NEXT VALUE FOR 函数在插入行之前获取下一序列号。 在调用 NEXT VALUE FOR 时分配该序列号,即使在该序列号永远也不插入某个表中时也是如此。 此 NEXT VALUE FOR 函数可用作表定义中某个列的默认值。 使用 sp_sequence_get_range 可一次获取某个范围的多个序列号。序列可定义为任何整数数据类型。 如果未指定数据类型,则序列将默认为 bigint。
使用序列
在以下情况下将使用序列,而非标识列:
-
应用程序要求在插入到表中之前有一个数值。
-
应用程序要求在多个表之间或者某个表内的多个列之间共享单个数值系列。
-
在达到指定的数值时,应用程序必须重新开始该数值系列。 例如,在分配值 1 到 10 后,应用程序再次开始分配值 1 到 10。
-
应用程序要求序列值按其他字段排序。 NEXT VALUE FOR 函数可以将 OVER 子句应用于该函数调用。 OVER 子句确保返回的值按照 OVER 子句的 ORDER BY 子句的顺序生成。
-
应用程序要求同时分配多个数值。 例如,应用程序需要保留五个序号。 如果正在同时向其他进程发出数值,则请求标识值可能会导致在系列中出现间断。 调用 sp_sequence_get_range 可以一次检索该序列中的若干数值。
-
您需要更改序列的规范,例如增量值。
限制
与不能更改其值的标识列不同,在插入到表后不自动保护序列值。 若要防止更改序列值,请对表使用更新触发器以便回滚更改。
对于序列值不自动强制唯一性。 按照设计能够重复使用序列值。 如果某个表中的序列值要求唯一,则对列创建唯一索引。 如果要求表中的序列值在一组表之间唯一,则创建触发器以免更新语句或序列号循环导致的重复项。
序列对象根据其定义生成数值,但序列对象不控制生成数值的方式。 在回滚事务时、在某个序列对象由多个表共享时或者在分配序列号且不在多个表中使用它们时,插入到表中的序列号可能具有间断。 当使用 CACHE 选项创建时,意外关机(如电源故障)可能导致缓存中的序列号丢失。
如果在单个 NEXT VALUE FOR 语句中有多个 Transact-SQL 函数的实例指定同一序列生成器,则所有这些实例返回该 Transact-SQL 语句独立于表来创建的。 此行为与 ANSI 标准保持一致。
典型用法
CREATE SEQUENCE Schema.SequenceName
AS int
START WITH 1
INCREMENT BY 1 ;
——————————————————
--Create the Test schema
CREATE SCHEMA Test ;
GO
-- Create a table
CREATE TABLE Test.Orders
(OrderID int PRIMARY KEY,
Name varchar(20) NOT NULL,
Qty int NOT NULL);
GO
-- Create a sequence
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1 ;
GO
-- Insert three records
INSERT Test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.CountBy1, 'Tire', 2) ;
INSERT test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.CountBy1, 'Seat', 1) ;
INSERT test.Orders (OrderID, Name, Qty)
VALUES (NEXT VALUE FOR Test.CountBy1, 'Brake', 1) ;
GO
-- View the table
SELECT * FROM Test.Orders ;
GO
下面是结果集:
OrderID Name Qty
1 Tire 2
2 Seat 1
3 Brake 1
D. 在结果集中生成重复序列号
下面的示例演示序列号的两个功能:循环以及在 select 语句中使用 NEXT VALUE FOR
。
CREATE SEQUENCE CountBy5
AS tinyint
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 5
CYCLE ;
GO
SELECT NEXT VALUE FOR CountBy5 AS SurveyGroup, Name FROM sys.objects ;
GO
F. 重置序列号
示例 E 使用了前 79 个 Samples.IDLabel
序列号。 (您的版本的 AdventureWorks2012
可能会返回不同数目的结果。)执行以下语句以便使用接下来的 79 个序列号(80 到 158)。
ALTER SEQUENCE Samples.IDLabel
RESTART WITH 1 ;