简介
SequenceNumber是SQL Server2012推出的一个新特性。这个特性允许数据库级别的序列号在多表或多列之间共享。对于某些场景会非常有用,比如,你需要在多个表之间公用一个流水号。以往的做法是额外建立一个表,然后存储流水号。而新插入的流水号需要两个步骤:
1.查询表中流水号的最大值
2.插入新值(最大值+1)
现在,利用SQL Server2012中的Sequence.这类操作将会变得非常容易。
SequenceNumber的基本概念
SequenceNumber的概念并不是一个新概念,Oracle早就已经实现了(http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6015.htm)。与以往的Identity列不同的是。SequenceNumber是一个与构架绑定的数据库级别的对象,而不是与具体的表的具体列所绑定。这意味着SequenceNumber带来多表之间共享序列号的遍历之外,还会带来如下不利影响:
- 与Identity列不同的是,Sequence插入表中的序列号可以被Update,除非通过触发器来进行保护
- 与Identity列不同,Sequence有可能插入重复值(对于循环SequenceNumber来说)
- Sequence仅仅负责产生序列号,并不负责控制如何使用序列号,因此当生成一个序列号被Rollback之后,Sequence会继续生成下一个号,从而在序列号之间产生间隙。
SequenceNumber的用法
SequenceNumber在MSDN中定义的原型如代码1所示。
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 } ]
[ ; ]
代码1.Sequence的创建原型
由代码1看以看到,参数相对比较简单。从指定数据类型(INT兼容)到开始计数点,步长,最大值和最小值,是否循环和是否缓存几个参数来设置Sequence。
下面图1创建了一个简单的Sequence。
图1.创建一个简单的Sequence并进行使用
此时,我们可以通过SQL Server 2012新增的视图sys.sequences来看到刚才创建成功的Sequence,如图2所示.
图2.sys.sequences视图
当然我们可以这个序列按照顺序插入表,如图3所示。
图3.在单表中插入序列
而SequenceNumber最重要的功能是在多表间共享序列号,如图4所示。
图4.多表之间利用Sequence共享序列号
前面图2可以看到,如果我们不指定Sequence的上限和下限,则默认使用所指定数据类型的最大值和最小值作为上限和下限(如图2INT类型的的上下限).当达到上线后,可以指定循环来让Sequence达到上限后从指定的开始值重新开始循环。如图5所示。
图5.Sequence设置上限下限和循环
还可以通过修改Sequence将其初始值指定为一个特定值,如图6所示。
图6.重置Sequence的值
Sequence一个需要注意的情况是Sequence只负责生成序列号,而不管序列号如何使用,如果事务不成功或回滚,SequenceNumber仍然会继续向后生成序列号,如图7所示。
图7.Sequence仅仅负责生成序列号
我们还可以为Sequence指定缓存选项,使得减少IO,比如,我们指定Cache选项为4,则当前的Sequence由1增长过4后,SQL Server会再分配4个空间变为从5到8,当分配到9时,SQL Server继续这以循环,如果不指定Cache值,则值由SQL Server进行分配。一个简单的例子如图8所示。
图8.为Sequence设置Cache选项
总结
本文讲述了SequenceNumber的简单用法。Sequence是一个比较方便的功能,如果使用妥当,将会大大减少开发工作和提升性能。
参考资料:Sequence Numbers
CREATE SEQUENCE (Transact-SQL)
分享到:
相关推荐
在SQL Server中模拟Oracle的Sequence,一种常见方法是通过存储过程实现。一个简单的实现方式是创建一个包含四个字段的表,如"AllSequence",字段包括:名称、起始值、递增值和当前值。每当需要一个新的序列值时,从...
### CDC操作Sqlserver2008 #### 概述 变更数据捕获(Change Data Capture,简称CDC)是SQL Server的一项重要功能,主要用于记录数据库表中的数据更改历史。这一功能在进行数据分析、日志记录、数据复制等场景下...
在`SQLSERVER 事务日志详解-华仔论坛.doc`文档中,可能会包含以下内容: 1. `fn_dblog`的使用示例,展示如何查询特定事务的历史操作。 2. 对`fn_dblog`返回的关键列的详细解释,帮助理解日志记录的含义。 3. 图形化...
LSN(Log Sequence Number)是SQL Server用于跟踪事务日志顺序的唯一编号。当系统报告LSN无效时,通常表示日志文件中的记录与数据文件中的状态不一致,可能是由于系统崩溃、非正常关机或硬件故障等原因造成。 下面...
SQL Server中的事务日志是数据库管理系统的关键组成部分,它在确保数据的持久性和事务一致性方面扮演着核心角色。事务日志的物理结构主要由虚拟日志文件(Virtual Log Files, VLFs)组成,这些文件是日志文件的逻辑...
**错误9003**是指数据库在启动过程中检测到日志文件(LDF)中的逻辑序列号(Logical Sequence Number, LSN)无效。LSN是一种用于跟踪数据库中数据更改记录的机制,当数据库恢复时,它会被用来确保数据的一致性。如果...
- 实现方式略有不同,例如在 Sqlserver 中可以使用 `IDENTITY` 关键字,在 Oracle 中则使用序列(`SEQUENCE`)。 - **表名规范**: - 各数据库在命名规则上略有不同,但普遍推荐使用有意义的英文单词或短语,并遵循...
从SQL Server向Oracle数据库迁移的过程中,涉及到的数据类型转换、序列(sequence)及触发器(trigger)的实现方式是关键的技术点。以下是对这些知识点的详细解析: ### 数据类型转换 #### Oracle与SQL Server的数据...
Sequence对象的引入是SQL Server 2012的一个重大改进,它类似于Oracle数据库中的序列(Sequence)。Sequence用于生成一系列有序的整数,通常作为主键或唯一标识的来源。创建Sequence的语法为`CREATE SEQUENCE`,使用...
在SQL Server中,流水号(Sequence Number)是一种用于生成唯一整数序列的数据库对象,它在数据表中常被用作主键或者标识列。在本压缩包"数据库sqlservser的流水号.rar"中,包含了一个名为"流水号.sql"的文件,这很...
- Oracle 引入了 `SEQUENCE` 生成有序的整数,SQL Server 则使用 `IDENTITY` 属性或自定义的 `TABLE VALUE` 函数。 9. **存储过程和函数** - SQL Server 使用 `CREATE PROCEDURE` 和 `CREATE FUNCTION`,Oracle ...
### Oracle与SQL Server的主要区别 #### 一、数据类型的不同 - **SQL Server**:提供了丰富的数据类型选项,包括但不限于`int`, `smallint`, `char`, `varchar`, `nchar`, `nvarchar`, `ntext`, `datetime`, `...
- `CAST()`和`CONVERT()`在SQL Server中用于类型转换,Oracle使用`TO_CHAR()`, `TO_DATE()`, `TO_NUMBER()`。 5. **聚合函数**: - `SUM()`, `COUNT()`, `AVG()`, `MIN()`, `MAX()`是两个系统共有的聚合函数。 -...
从给定的文件信息来看,主要内容涉及的是数据库管理和SQL语句在Oracle数据库中的应用,尽管标题提到了SQL Server,但实际内容偏向于Oracle。以下是对关键知识点的详细解析: ### 数据库表空间管理 在Oracle数据库...
LSN(Log Sequence Number,日志序列号)是日志记录的物理地址,由三个部分组成:VLF(Virtual Log File,虚拟日志文件)编号、日志段起始数据块号、日志记录所在槽的序号。LSN的每个部分都是一个整数,总长度为10...
本文将深入探讨Oracle中实现自增长序列(Sequence)与SQL Server中的自增列(Identity Column)的相似之处,以及如何在Oracle中通过序列和触发器来模拟SQL Server的自增列特性。 ### Oracle中的自增长序列...
sql 语句,erp项目中的存储过程, 其中有解析json 的案例 SELECT @CContractCode=StringValue from (SELECT * FROM ( SELECT *, row_number() OVER( ORDER BY sequenceNo) k from parseJSON(@string)) as s WHERE k ...
这里我们将讨论如何使用`SEQUENCE`和`TRIGGER`来创建类似SQL Server中的自增字段。 1. **创建Sequence**: Oracle中的`SEQUENCE`是用来生成唯一序列号的对象。在给定的描述中,创建了一个名为`SEQU_DATA_DATAINFO`...
事务日志备份的内容主要是日志记录(也就是重做数据)范围内的数据,这个范围是由first_lsn(First Log Sequence Number,首日志序列号)和last_lsn(Last Log Sequence Number,末日志序列号)所界定。first_lsn和...