从 SQLserver 2012 开始,微软数据库增加了新的编程对象——序列号。序列号的创建语法基本和oracle一样。

更多参考:​​序列号​


创建序列号语法:​​CREATE SEQUENCE (Transact-SQL)​

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 } ]
[ ; ]



创建序列号:

CREATE SEQUENCE [dbo].[Sequence_Test] 
AS [bigint] --整数类型
START WITH 1 --起始值
INCREMENT BY 1 --增量值
MINVALUE 1 --最小值
MAXVALUE 9999999 --最大值
CYCLE --达到最值循环 [ CYCLE | NO CYCLE ]
CACHE 5 --每次取出5个值缓存使用 [ CACHE [<常量>] | NO CACHE ]
GO

SqlServer 2012 序列号_序列号



查看序列号信息:

SELECT * FROM sys.sequences



使用方法:

--  获取下一个值
SELECT NEXT VALUE FOR [dbo].[Sequence_Test];

-- 重置为1
ALTER SEQUENCE [dbo].[Sequence_Test] RESTART WITH 1 ;

-- 加编号
SELECT NEXT VALUE FOR [Sequence_Test] AS id, Name FROM sys.objects ;


--  【给表插入编号】

ALTER SEQUENCE [dbo].[Sequence_Test] RESTART WITH 1 ;

-- DROP TABLE #TEMP
CREATE TABLE #TEMP(ID INT,DTIME DATETIME)

INSERT INTO #TEMP VALUES (NEXT VALUE FOR [dbo].[Sequence_Test], GETDATE()) ;

INSERT INTO #TEMP SELECT NEXT VALUE FOR [dbo].[Sequence_Test], GETDATE();

SELECT * FROM #TEMP

SqlServer 2012 序列号_Test_02



--  【作为默认值使用】

-- 先删除刚才的临时表
DROP TABLE #TEMP

-- 临时表不可这样使用(错误)
CREATE TABLE #TEMP(ID INT PRIMARY KEY CLUSTERED DEFAULT(NEXT VALUE FOR [dbo].[Sequence_Test]),DTIME DATETIME)

SqlServer 2012 序列号_Test_03



--  临时表不可用,换成实体表
CREATE TABLE TEMP(ID INT PRIMARY KEY CLUSTERED DEFAULT(NEXT VALUE FOR [dbo].[Sequence_Test]),DTIME DATETIME)

-- ALTER TABLE [dbo].[TEMP] ADD DEFAULT (NEXT VALUE FOR [dbo].[Sequence_Test]) FOR [ID]

ALTER SEQUENCE [dbo].[Sequence_Test] RESTART WITH 1 ;

INSERT INTO TEMP(DTIME) SELECT GETDATE()
GO 10

SELECT * FROM TEMP

SqlServer 2012 序列号_序列号_04



--  若保留其中 10 个号码,使用存储过程 sys.sp_sequence_get_range 跳过 10 个。
DECLARE
@FirstSeqNum sql_variant
, @LastSeqNum sql_variant
, @CycleCount int
, @SeqIncr sql_variant
, @SeqMinVal sql_variant
, @SeqMaxVal sql_variant ;

EXEC sys.sp_sequence_get_range
@sequence_name = N'dbo.Sequence_Test'
, @range_size = 10
, @range_first_value = @FirstSeqNum OUTPUT
, @range_last_value = @LastSeqNum OUTPUT
, @range_cycle_count = @CycleCount OUTPUT
, @sequence_increment = @SeqIncr OUTPUT
, @sequence_min_value = @SeqMinVal OUTPUT
, @sequence_max_value = @SeqMaxVal OUTPUT ;

SELECT
@FirstSeqNum AS FirstVal
, @LastSeqNum AS LastVal
, @CycleCount AS CycleCount
, @SeqIncr AS SeqIncrement
, @SeqMinVal AS MinSeq
, @SeqMaxVal AS MaxSeq ;

SqlServer 2012 序列号_序列号_05



--  执行完成后,当前值增加了10,下次获取编号时,将接着继续。(未使用的的10个编号对表可显示插入数据)


SELECT current_value FROM sys.sequences --当前编号

INSERT INTO TEMP(DTIME) SELECT GETDATE() --此时插入id为21

-- 显示插入数据
INSERT INTO TEMP(ID,DTIME) SELECT 13,GETDATE()--此处将未使用的13显示插入

SELECT * FROM TEMP

SqlServer 2012 序列号_sql_06



删除序列号:

--  删除序列,报错
DROP SEQUENCE [dbo].[Sequence_Test]

-- 因为表中默认值定义了序列,先去掉
ALTER TABLE [dbo].[TEMP] DROP CONSTRAINT [DF__TEMP__ID__60C757A0]

-- 删除序列
DROP SEQUENCE [dbo].[Sequence_Test]

SqlServer 2012 序列号_序列号_07



对象权限管理:

--【只许某用户查询编号】

-- 授予用户 [AA] 只要查询序列的权限
GRANT CONTROL ON [dbo].[Sequence_Test] TO [AA]
GRANT CONTROL ON OBJECT::dbo.Sequence_Test TO [AA]

-- 用户 [AA] 登录后只可执行以下语句
SELECT NEXT VALUE FOR [dbo].[Sequence_Test];



参考:

​序列号​

​CREATE SEQUENCE (Transact-SQL)​