眾所周知,在之前的SQL SERVER版本中,一般采用GUID或者IDENTITY來作為標示符,但是IDENTITY是一個表對象,只能保證在一張表里面的序列,當我們遇到以下情況時,
如上表,我們需要在多表之間,實現ID的一致性,在SQL SERVER里面就會有一定的麻煩,通常我們會使用額外使用一張TEMP表來映射這些ID的關系然后再從中取序列來完成。
SEQUENCE在ORACLE中其實很早就存在了,SQL SERVER 2012的SEQUENCE功能和那個相似,是一個基於SCHEMA的對象,所以可以被多表調用。
序列是用戶定義的綁定到架構的對象,該對象可根據創建序列所依據的規范來生成數值序列。 這組數值以定義的間隔按升序或降序生成,並且可配置為用盡時重新啟動(循環)。 序列不與特定表相關聯,這一點與標識列不同。 應用程序將引用某一序列對象以便檢索其下一個值。 序列與表之間的關系由應用程序控制。 用戶應用程序可以引用一個序列對象,並跨多個行和表協調值。與在插入行時生成的標識列值不同,應用程序可以獲得下一個序列號,而不必通過調用 NEXT VALUE FOR 函數來插入行。 使用 sp_sequence_get_range 同時獲取多個序列號。
SEQUENCE語法如下: (創建一個序列對象並指定其屬性)
CREATE SEQUENCE [schema_name . ] sequence_name [ AS [ built_in_integer_type | user-defined_integer_type ] ] [ START WITH <constant> ] [ INCREMENT BY <constant> ] [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ] [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ] [ CYCLE | { NO CYCLE } ] [ { CACHE [ <constant> ] } | { NO CACHE } ] [ ; ]
sequence_name 指定數據庫中標識序列的唯一名稱。 類型為 sysname。
[ built_in_integer_type | user-defined_integer_type 序列可定義為任何整數類型。如果未提供任何數據類型,則默認 bigint類型。
START WITH 序列對象返回的第一個值。 START 值必須小於或等於序列對象的最大值並大於或等於其最小值。
INCREMENT BY 每次調用 NEXT VALUE FOR 函數時序列對象值遞增(如果為負數,則為遞減)的值。
MIN和MAX 分別設置最小和最大值
CYCLE 設置是否循環,默認循環選項是 NO CYCLE
CACHE 通過最大限度地減少生成序列編號所需的磁盤 IO 數,可以提高使用序列對象的應用程序的性能。 默認值為 CACHE。
ORACLE中有SEQUENCE的功能,SQL SERVER類似的功能使用IDENTITY列實現,但是有很大的局限性。在2012中,微軟終於增加了 SEQUENCE 對象,功能和性能都有了很大的提高。
我們可以在SSMS中創建也可以使用SQL SERVER腳本創建序列對象:


使用SQL創建序列對象:
IF EXISTS(SELECT * FROM sys.sequences WHERE name = N'TestSeq') DROP SEQUENCE TestSeq; GO --創建序列對象 CREATE SEQUENCE TestSeq AS TINYINT START WITH 1 INCREMENT BY 1; GO --創建表 CREATE TABLE TEST(ID tinyint, Name varchar(150)) --產生序列號碼並插入表中 INSERT INTO TEST(ID,Name) VALUES(NEXT VALUE FOR TestSeq, 'allen') INSERT INTO TEST(ID,Name) VALUES(NEXT VALUE FOR TestSeq, 'kevin') SELECT * FROM TEST

--產生序列可以重復使用,下面的例子當序列號碼超過255后又重新從0開始。 CREATE SEQUENCE [dbo].[Test1Seq] AS [tinyint] START WITH 0 INCREMENT BY 5 CYCLE SELECT NEXT VALUE FOR [Test1Seq]

--重新將序列初始值變為5 ALTER SEQUENCE dbo.TestSeq RESTART WITH 5; SELECT * FROM sys.sequences WHERE name = 'TestSeq'

--共享序列,兩個表可以使用同一個序列對象(IDENTITY列是不可以的) CREATE SEQUENCE dbo.Seq AS INT START WITH 1 INCREMENT BY 1 CREATE TABLE dbo.Examp1 ( Seq INT NOT NULL, Name VARCHAR(50) NOT NULL ); CREATE TABLE dbo.Examp2 ( Seq INT NOT NULL, Name VARCHAR(50)NOTNULL ); INSERT INTO dbo.Examp1(Seq,Name) VALUES (NEXT VALUE FOR dbo.Seq, 'Tom'); INSERT INTO dbo.Examp2(Seq,Name) VALUES (NEXT VALUE FOR dbo.Seq, 'Jerry'); SELECT * FROM Examp1 SELECT * FROM Examp2

--可以直接在查詢中使用序列對象(IDENTITY列是不可以的) CREATE SEQUENCE SeqOrder AS tinyint START WITH1 INCREMENT BY1 MINVALUE 1 NO MAXVALUE CYCLE; GO SELECT ID, Name,NEXT VALUE FOR SeqOrder OVER(ORDER BY Name DESC) AS [Order] FROM test;

為了提升性能,還可以使用CACHE選項,這樣就可以將序列號碼緩存到內存,減少IO操作,值得一提的是序列對象可以指定最大值和最小值,增加值可以為負數。
