SQL Server 2012新功能序列

时间:2017-07-11 14:54:37

标签: sql-server tsql sql-server-2012 sequence

是否有可能使用一个序列为每个表生成初始值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.TestSequence
    START WITH 1  
    INCREMENT BY 1 ;  
GO  

-- Insert three records  
INSERT Test.Orders (OrderID, Name, Qty)  

    VALUES (NEXT VALUE FOR Test.TestSequence, 'One', 2) ; 

INSERT test.Orders (OrderID, Name, Qty)  

    VALUES (NEXT VALUE FOR Test.TestSequence, 'Two', 1) ; 

INSERT test.Orders (OrderID, Name, Qty)  

    VALUES (NEXT VALUE FOR Test.TestSequence, 'Three', 1) ;  
GO  

-- View the table  
SELECT * FROM Test.Orders ;  
GO

    CREATE TABLE Test.Employee  
    (EmpId int PRIMARY KEY,  
    EmpName varchar(20) NOT NULL,  
    DeptId int NOT NULL,
    Sal Decimal(15,2));  
GO  
insert into Test.Employee (EmpId,EmpName,DeptId,Sal) values

(NEXT VALUE FOR Test.TestSequence,'One',1,45000),

(NEXT VALUE FOR Test.TestSequence,'Two',2,54000),

(NEXT VALUE FOR Test.TestSequence,'Three',3,60000),

(NEXT VALUE FOR Test.TestSequence,'Four',2,75000)


INSERT Test.Orders (OrderID, Name, Qty)  
    VALUES (NEXT VALUE FOR Test.TestSequence, 'Four', 5) ;  

    insert into Test.Employee (EmpId,EmpName,DeptId,Sal) values

(NEXT VALUE FOR Test.TestSequence,'Five',1,90000)

select * from Test.Orders 

select * from Test.Employee 

O / P: -

OrderID,    Name,   Qty
1      One      2 
2      Two      1
3     Three     1
8     Four      5

EmpId   EmpName DeptId  Sal
4   One      1      45000.00
5   Two      2      54000.00
6   Three    3      60000.00
7   Four     2      75000.00
9   Five     1      90000.00

期待结果: - OrderId = 1,2,3,4 ....

1 个答案:

答案 0 :(得分:4)

使用Sequenceidentity column不能)的优势是:

  1. Sequence未与任何表绑定,而在创建表时必须创建identitySequence可以稍后添加到列中。

  2. Sequence支持Cyclying功能,可以重复数字组。

  3. Truncate不会重置Sequence号码。

  4. 您无法更新identity列。 (直接更新身份值,而不是identity_insert

  5. 正如Alex在评论中所说的那样,Sequence可以在您需要密钥时不会在不同的表之间发生冲突时为您提供便利。

  6. 因此,对于任意数量的表格,您可以使用为SequenceMinValue 1创建的相同Start with 1。列。

    请注意,当您使用Cyclying时,最好将MinValue设置为1而不是Start With,否则,当Sequence点击{{1}时如果你没有指定Max,它将返回到Min,默认为Min

    将为-2147483648