之前場景下,要求先去數據 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 ;
