目录
我们知道在oracle中可方便的使用序列,即SEQUENCE,但是SQL Server直到2012才引入SEQUENCE。在SQL Server 2008中只有identity,但这并不能满足我们的需求。本文将介绍 SQL Server 2012中的SEQUENCE的正确使用。
SQL Server中的SEQUENCE
创建一个测试数据库:hyperdb
--创建测试数据库
USE master
GO
CREATE DATABASE hyperdb
GO
在数据库级别,创建一个bigint的SEQUENCE,然后检查创建的情况:
--创建数据库级别的序列:SEQUENCE
USE hyperdb
go
CREATE SEQUENCE [dbo].[TableSequenceID] AS [bigint]
START WITH 50
INCREMENT BY 1
--检查序列的创建情况
SELECT * FROM sys.sequences
或查看SSMS中的序列属性
创建两张表TestA与TestB做序列测试:
--创建测试表
CREATE TABLE TestA
(
ID BIGINT NOT NULL primary key,
NAME NVARCHAR ( 20 )
)
CREATE TABLE TestB
(
ID BIGINT NOT NULL primary key,
NAME NVARCHAR ( 20 )
)
在insert记录时使用序列:
--分别对表TestA与TestB插入记录
INSERT INTO TestA VALUES ( NEXT VALUE FOR TableSequenceID, 'Hyper A' )
INSERT INTO TestB VALUES ( NEXT VALUE FOR TableSequenceID, 'Hyper B' )
INSERT INTO TestA VALUES ( NEXT VALUE FOR TableSequenceID ,'Hyper A' )
INSERT INTO TestB VALUES ( NEXT VALUE FOR TableSequenceID ,'Hyper B' )
检查序列使用的结果:
select * from TestA
select * from TestB
SEQUENCE的正确使用
上述对SQL Server 2012中的SEQUENCE进行了简单使用,对正确使用SEQUENCE时还需注意如下3个问题:
- 由于序列是数据库级别的,因此单表中的值是不连续的
- 序列可以缓存到内存中,如使用如下T-SQL创建序列,缓存25个序列值(注意:CACHE 25)
CREATE SEQUENCE [dbo].[TableSequenceID] AS [bigint]
START WITH 50
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
NO CYCLE
CACHE 25
- 当获取到下一个序列值时,即该序列值被使用,而不管是否是INSERT/SELECT
SELECT NEXT VALUE FOR TableSequenceID
参考资料
Sequences in SQL Server 2012
http://www.sqlservercentral.com/articles/sequence/88422/Sequence Numbers
https://msdn.microsoft.com/en-us/library/ff878058%28v=SQL.110%29.aspx