加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SqlServer 2012 序列号

发布时间:2020-12-12 12:58:54 所属栏目:MsSql教程 来源:网络整理
导读:从 SQLserver?2012 开始,微软数据库增加了新的编程对象——序列号。序列号的创建语法基本和oracle一样。 更多参考:序列号 创建序列号语法:CREATE SEQUENCE (Transact-SQL) CREATE SEQUENCE [schema_name . ] sequence_name [ AS [ built_in_integer_type

从 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



查看序列号信息:

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



--	【作为默认值使用】

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

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



--	临时表不可用,换成实体表
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



--	若保留其中 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 ;



--	执行完成后,当前值增加了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



删除序列号:

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

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

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



对象权限管理:

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

--	授予用户 [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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读