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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |