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 ;

相關文章
相關標籤/搜索