SQL Server序列SEQUENCE用法介绍

目录
  • 一、概述
    • 选择使用序列的情况:
  • 二、创建序列:CREATE SEQUENCE
  • 二、使用序列号:NEXT VALUE FOR
    • 1、序列值插入到表中
    • 2、在select 语句中使用 NEXT VALUE FOR 。
    • 3、通过使用 OVER 子句为结果集生成序列号
    • 4、sp_sequence_get_range:同时获取多个序列号
    • 5、将表从标识更改为序列
  • 三、管理序列
    • 1、更新(重置)序列:ALTER SEQUENCE
    • 2、DROP SEQUENCE:删除序列
    • 3、查看序列信息

一、概述

SQL SERVER2012 之前版本,一般采用GUID或者IDENTITY来作为标示符。在2012中,微软终于增加了 SEQUENCE 对象,功能和性能都有了很大的提高。 
序列是一种用户定义的架构绑定对象,它根据创建该序列时采用的规范生成一组数值。 这组数值以定义的间隔按升序或降序生成,并且可根据要求循环(重复)。

  • 序列不与表相关联,这一点与标识列不同。
  • 应用程序将引用某一序列对象以便接收其下一个值。
  • 序列是通过使用 CREATE SEQUENCE 语句独立于表来创建的。 其选项使您可以控制增量、最大值和最小值、起始点、自动重新开始功能和缓存以便改进性能。
  • 与在插入行时生成的标识列值不同,应用程序可以通过调用 NEXT VALUE FOR 函数在插入行之前获取下一序列号。 在调用 NEXT VALUE FOR 时分配该序列号,即使在该序列号永远也不插入某个表中时也是如此。 此 NEXT VALUE FOR 函数可用作表定义中某个列的默认值。
  • 使用 sp_sequence_get_range 可一次获取某个范围的多个序列号。
  • 序列可定义为任何整数数据类型。 如tinyint, smallint, int, bigint, decimal 或是小数精度为0的数值类型。如果未指定数据类型,则序列将默认为 bigint

序列的限制(limitation)有二个

  • 序列不支持事务,即使事务中进行了回滚(rollback)操作,序列仍然返回下一个元素。
  • 序列不支持SQL Server 复制(replication),序列不会复制到订阅的SQL Server实例中。如果一个表的默认值依赖一个序列,而序列又是不可复制的,这会导致订阅的SQL Server出现脚本错误。

选择使用序列的情况:

在以下情况下将使用序列,而非标识列:

  • 应用程序要求在插入到表中之前有一个数值。
  • 应用程序要求在多个表之间或者某个表内的多个列之间共享单个数值系列。
  • 在达到指定的数值时,应用程序必须重新开始该数值系列。 例如,在分配值 1 到 10 后,应用程序再次开始分配值 1 到 10。
  • 应用程序要求序列值按其他字段排序。 NEXT VALUE FOR 函数可以将 OVER 子句应用于该函数调用。 OVER 子句确保返回的值按照 OVER 子句的 ORDER BY 子句的顺序生成。
  • 应用程序要求同时分配多个数值。 例如,应用程序需要保留五个序号。 如果正在同时向其他进程发出数值,则请求标识值可能会导致在系列中出现间断。 调用 sp_sequence_get_range 可以一次检索该序列中的若干数值。
  • 您需要更改序列的规范,例如增量值。

二、创建序列:CREATE SEQUENCE

我们可以在SSMS中创建也可以使用SQL SERVER脚本创建序列对象:

1、使用默认值创建序列:若要创建从 -2,147,483,648 到 2,147,483,647 且增量为 1 的整数序列号。

CREATE SEQUENCE Schema.SequenceName
    AS int
    INCREMENT BY 1 ;

2、若要创建类似于从 1 到 2,147,483,647 且增量为 1 的标识列的整数序列号,请使用以下语句。

CREATE SEQUENCE Schema.SequenceName
    AS int
    START WITH 1
    INCREMENT BY 1 ;

3、使用所有参数创建序列

以下示例使用 decimal 数据类型(范围为 0 到 255)创建一个名为 DecSeq 的序列 。 序列以 125 开始,每次生成数字时递增 25。 因为该序列配置为可循环,所以,当值超过最大值 200 时,序列将从最小值 100 重新开始。

CREATE SEQUENCE Test.DecSeq
    AS decimal(3,0)
    START WITH 125
    INCREMENT BY 25
    MINVALUE 100
    MAXVALUE 200
    CYCLE
    CACHE 3  ;

二、使用序列号:NEXT VALUE FOR

执行以下语句可查看第一个值;START WITH 选项为 125。将该语句再执行三次,以返回 150、175 和 200。再次执行该语句,以查看起始值如何循环回到 MINVALUE选项值 100。

SELECT NEXT VALUE FOR Test.DecSeq;

1、序列值插入到表中

下面的示例创建一个名为 Test 的架构、一个名为 Orders 的表以及一个名为 CountBy1 的序列,然后使用 NEXT VALUE FOR 函数将行插入到该表中。

--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.CountBy1
    START WITH 1
    INCREMENT BY 1 ;
GO  

-- Insert three records
INSERT Test.Orders (OrderID, Name, Qty)
    VALUES (NEXT VALUE FOR Test.CountBy1, 'Tire', 2) ;
INSERT test.Orders (OrderID, Name, Qty)
    VALUES (NEXT VALUE FOR Test.CountBy1, 'Seat', 1) ;
INSERT test.Orders (OrderID, Name, Qty)
    VALUES (NEXT VALUE FOR Test.CountBy1, 'Brake', 1) ;
GO  

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

下面是结果集:

OrderID Name Qty

1 Tire 2

2 Seat 1

3 Brake 1

2、在select 语句中使用 NEXT VALUE FOR 。

SELECT NEXT VALUE FOR CountBy5 AS SurveyGroup, Name FROM sys.objects ;

3、通过使用 OVER 子句为结果集生成序列号

SELECT NEXT VALUE FOR Samples.IDLabel OVER (ORDER BY Name) AS NutID, ProductID, Name, ProductNumber FROM Production.Product
WHERE Name LIKE '%nut%' ;

4、sp_sequence_get_range:同时获取多个序列号

从序列对象中返回一系列序列值。 序列对象生成和发出请求的值数目,并为应用程序提供与该系列序列值相关的元数据。

以下语句从 RangeSeq 序列对象中获取四个序列号,并向用户返回过程中的所有输出值。

DECLARE @range_first_value_output sql_variant ;  

EXEC sys.sp_sequence_get_range
@sequence_name = N'Test.RangeSeq'
, @range_size = 4
, @range_first_value = @range_first_value_output OUTPUT ;  

SELECT @range_first_value_output AS FirstNumber ;

5、将表从标识更改为序列

下面的示例创建一个包含该示例的三行的架构和表。 然后,该示例添加一个新列并且删除旧列。

使用 Transact-SQL 的 SELECT * 语句将这个新列作为最后一列接收,而非作为第一列接收。 如果这样做是不可接受的,则您必须创建全新的表,将数据移到该表中,然后针对这个新表重新创建权限。

-- 添加没有IDENTITY属性的新列
ALTER TABLE Test.Department
    ADD DepartmentIDNew smallint NULL
GO  

-- 将值从旧列复制到新列
UPDATE Test.Department
    SET DepartmentIDNew = DepartmentID ;
GO  

-- 删除旧列上的主键约束
ALTER TABLE Test.Department
    DROP CONSTRAINT [PK_Department_DepartmentID];
-- 删除旧列
ALTER TABLE Test.Department
    DROP COLUMN DepartmentID ;
GO  

-- 将新列重命名为旧列名
EXEC sp_rename 'Test.Department.DepartmentIDNew',
    'DepartmentID', 'COLUMN';
GO  

-- 将新列更改为NOT NULL
ALTER TABLE Test.Department
    ALTER COLUMN DepartmentID smallint NOT NULL ;
-- 添加唯一的主键约束
ALTER TABLE Test.Department
    ADD CONSTRAINT PK_Department_DepartmentID PRIMARY KEY CLUSTERED
         (DepartmentID ASC) ;
-- 从DepartmentID列中获取当前的最高值,并创建一个用于列的序列。(返回3。)
SELECT MAX(DepartmentID) FROM Test.Department ;
--使用下一个期望值(4)作为START WITH VALUE;
CREATE SEQUENCE Test.DeptSeq
    AS smallint
    START WITH 4
    INCREMENT BY 1 ;
GO  

-- 为DepartmentID列添加一个默认值
ALTER TABLE Test.Department
    ADD CONSTRAINT DefSequence DEFAULT (NEXT VALUE FOR Test.DeptSeq)   FOR DepartmentID;
GO  

-- 查看结果
SELECT DepartmentID, Name, GroupName  FROM Test.Department ;
-- Test insert
INSERT Test.Department (Name, GroupName)  VALUES ('Audit', 'Quality Assurance') ;
GO  

-- 查看结果
SELECT DepartmentID, Name, GroupName  FROM Test.Department ;
GO

三、管理序列

1、更新(重置)序列:ALTER SEQUENCE

重新开始 Samples.IDLabel 序列。

ALTER SEQUENCE Samples.IDLabel  RESTART WITH 1 ;

2、DROP SEQUENCE:删除序列

在生成编号后,序列对象与其生成的编号之间没有延续关系,因此可以删除序列对象,即使生成的编号仍在使用。

当序列对象由存储过程或触发器引用时,可以删除序列对象,因为序列对象未绑定到架构上。 如果序列对象是作为表中的默认值引用的,则无法删除序列对象。 错误消息将列出引用序列的对象。

以下示例从当前数据库中删除一个名为 CountBy1 的序列对象。

DROP SEQUENCE CountBy1 ;

3、查看序列信息

有关序列的信息,请查询 sys.sequences

执行以下代码,以确认缓存大小并查看当前值。

SELECT cache_size, current_value   FROM sys.sequences  WHERE name = 'DecSeq' ;

到此这篇关于SQL Server序列SEQUENCE的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • sqlserver实现oracle的sequence方法

    当然这点小问题是难不倒我们程序员的,"max+1啊",有人会说这样的方式.是的,这种方式实现起来也比较简单.当然你也许还会说,最Sql的方式是采用identity列,自增的方式去增加就ok了.但是这样的列如果要实现"YYYYMMDD"+Sequence值 (例如:2008072400001)的格式就不行了.还是老老实实用存储过程来取得一个Sequence值吧,使用起来也就随心所欲了. 网上常见的一个存储过程为 为当前库所有用到Sequence建一张表,譬如"

  • SQL Server新特性SequenceNumber用法介绍

    简介 SequenceNumber是SQL Server2012推出的一个新特性.这个特性允许数据库级别的序列号在多表或多列之间共享.对于某些场景会非常有用,比如,你需要在多个表之间公用一个流水号.以往的做法是额外建立一个表,然后存储流水号.而新插入的流水号需要两个步骤: 1.查询表中流水号的最大值 2.插入新值(最大值+1) 现在,利用SQL Server2012中的Sequence.这类操作将会变得非常容易. SequenceNumber的基本概念 SequenceNumber的概念并不是一

  • SQL Server中Sequence对象用法

    一.Sequence简介 Sequence对象对于Oracle用户来说是最熟悉不过的数据库对象了, 在SQL SERVER2012终于也可以看到这个对象了.Sequence是SQL Server2012推出的一个新特性.这个特性允许数据库级别的序列号在多表或多列之间共享. 二.Sequence基本概念 Oracle中有Sequence的功能,SQL server类似的功能要使用identity列实现,但是identity列有很大的局限性.微软终于在2012中添加了Sequence对象.与以往id

  • SQL Server序列SEQUENCE用法介绍

    目录 一.概述 选择使用序列的情况: 二.创建序列:CREATE SEQUENCE 二.使用序列号:NEXT VALUE FOR 1.序列值插入到表中 2.在select 语句中使用 NEXT VALUE FOR . 3.通过使用 OVER 子句为结果集生成序列号 4.sp_sequence_get_range:同时获取多个序列号 5.将表从标识更改为序列 三.管理序列 1.更新(重置)序列:ALTER SEQUENCE 2.DROP SEQUENCE:删除序列 3.查看序列信息 一.概述 SQ

  • SQL Server 全文搜索功能介绍

    SQL Server 的全文搜索(Full-Text Search)是基于分词的文本检索功能,依赖于全文索引.全文索引不同于传统的平衡树(B-Tree)索引和列存储索引,它是由数据表构成的,称作倒转索引(Invert Index),存储分词和行的唯一键的映射关系.倒转索引是在创建全文索引或更新全文索引时,由SQL Server自动创建和维护的.全文索引主要包含三种分析器:分词器(Word Breaker).词干分析器(stemmer)和同义词分析器.全文索引中存储的数据是分词及其位置等信息,分词

  • SQL Server DATEDIFF() 函数用法

    定义和用法 DATEDIFF(datepart,startdate,enddate) startdate 和 enddate 参数是合法的日期表达式.datepart 参数可以是下列的值: 实例 select DATEDIFF(dd,'2021-12-01','2021-12-02 ')day --天数 select DATEDIFF(hh,'2021-12-01 08:00','2021-12-01 17:00') hour --小时 select DATEDIFF(mi,'2021-12-0

  • 行转列之SQL SERVER PIVOT与用法详解

    在数据库操作中,有些时候我们遇到需要实现"行转列"的需求,例如一下的表为某店铺的一周收入情况表: WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIMAL) 我们先插入一些模拟数据: INSERT INTO WEEK_INCOME SELECT '星期一',1000 UNION ALL SELECT '星期二',2000 UNION ALL SELECT '星期三',3000 UNION ALL SELECT '星期四',4000 UNION ALL SE

  • SQL Server实现分页方法介绍

    一.创建测试表 CREATE TABLE [dbo].[Student]( [id] [int] NOT NULL, [name] [nvarchar](50) NULL, [age] [int] NULL) 二.创建测试数据 declare @i int set @i=1 while(@i<10000) begin insert into Student select @i,left(newid(),7),@i+12 set @i += 1 end 三.测试 1.使用top关键字 top关键字

  • SQL Server中的游标介绍

    游标是面向行的,它会使开发人员变懒,懒得去想用面向集合的查询方式实现某些功能. 在性能上,游标会吃更多的内存,减少可用的并发,占用带宽,锁定资源,当然还有更多的代码量.用一个比喻来说明为什么游标会占用更多的资源.当你从ATM机取款的时候,是一次取1000的效率更高呢,还是10次100呢? 游标是非常邪恶的一种存在,使用游标经常会比使用面向集合的方法慢2-3倍,当游标定义在大数据量时,这个比例还会增加.如果可能,尽量使用while,子查询,临时表,函数,表变量等来替代游标,记住,游标永远只是你最后

  • SQL Server中的事务介绍

    事务全部是关于原子性的.原子性的概念是指可以把一些事情当做一个单元来看待.从数据库的角度看,它是指应全部执行或全部都不执行的一条或多条语句的最小组合.为了理解事务的概念,需要能够定义非常明确的边界.事务要有非常明确的开始和结束点.SQL Server中的每一条SELECT.INSERT.UPDATE和DELETE语句都是隐式事务的一部分.即使只发出一条语句,也会把这条语句当做一个事务-要么执行语句中的所有内容,要么什么都不执行.但是如果需要的不只是一条,可能是多条语句呢?在这种情况下,就需要有一

  • SQL Server中T-SQL标识符介绍与无排序生成序号的方法

    T-SQL 标识符 在T-SQL语言中,对SQLServer数据库及其数据对象(比如表.索引.视图.存储过程.触发器等)需要以名称来进行命名并加以区分,这些名称就称为标识符. 通常情况下,SQLServer数据库.数据库以及各种数据对象都应该有一个标识符,但对于某些对象来说,比如约束,标识符是可选的.推荐每个对象都使用标识符. 1.常规标识符的规则 (1).首字符:标识符的第一个字符必须满足下列条件: Unicode标准3.2定义的字母,通常就是字母a~z和A~Z. 下划线(_).at字符(@)

  • Sql Server中的视图介绍

    一):视图的定义 视图是由基于一个或多个表的一个查询所定义的虚拟表,它将查询的具体定义保存起来,视图不包含任何数据. 视图在操作上和数据表没有什么区别,但两者的差异是在其本质上的.数据表是实际存储记录的地方,然而视图并不是保存任何记录,它存储的实际上是查询语句. 相同的数据表,根据不同用户的不同需求,可以创建不同的视图. 二):视图的作用 1):筛选表中的行 2):防止未经许可的用户访问敏感数据 3):降低数据库的复杂程度 4):将多个物理数据抽象为一个逻辑数据库 三):创建视图实例 复制代码

随机推荐