sql server2017使用序列

以前场景下,要求先去数据 Max()而后加1 分红两部操做,能够能够一步完成sql

——————————————————————————缓存

序列是经过使用 CREATE SEQUENCE 语句独立于表来建立的。 其选项使您能够控制增量、最大值和最小值、起始点、自动从新开始功能和缓存以便改进性能。 有关这些选项的信息,请参阅 CREATE SEQUENCE函数

与在插入行时生成的标识列值不一样,应用程序能够经过调用 NEXT VALUE FOR 函数在插入行以前获取下一序列号。 在调用 NEXT VALUE FOR 时分配该序列号,即便在该序列号永远也不插入某个表中时也是如此。 此 NEXT VALUE FOR 函数可用做表定义中某个列的默认值。 使用 sp_sequence_get_range 可一次获取某个范围的多个序列号。序列可定义为任何整数数据类型。 若是未指定数据类型,则序列将默认为 bigint。性能

使用序列

在如下状况下将使用序列,而非标识列:spa

  • 应用程序要求在插入到表中以前有一个数值。设计

  • 应用程序要求在多个表之间或者某个表内的多个列之间共享单个数值系列。code

  • 在达到指定的数值时,应用程序必须从新开始该数值系列。 例如,在分配值 1 到 10 后,应用程序再次开始分配值 1 到 10。server

  • 应用程序要求序列值按其余字段排序。 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 ;

相关文章
相关标签/搜索