一种在SQLServer中实现Sequence的高效方法

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 如果在ORACLE里面用惯了Sequence的兄弟们,要在SqlServer里实现Sequence,就会发现没有现成的Sequence对象可以Create了。那应该怎么办呢? 当然这点小问题是难不倒我们程序员的,“max+1啊”,有人会说这样的方式。
+关注继续查看

如果在ORACLE里面用惯了Sequence的兄弟们,要在SqlServer里实现Sequence,就会发现没有现成的Sequence对象可以Create了。那应该怎么办呢?

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

 

网上常见的一个存储过程为 为当前库所有用到Sequence建一张表,譬如“AllSequence”,内含四个字段【名字,起点值,递增值,当前值】,创建Sequence的时候就创建一条记录,获取Sequence的时候就从对应行的当前值按递增值增加得到。

 

在并发性请求不那么高的系统里,这种过程是没有问题的。但是并发性请求一旦处于某个量级以后,这个过程常常会遇到问题。

 

以下为一个改进方法,适合于高吞吐量的访问请求,比如每秒数千次的请求:

 

-- 假定要给T_0101001创建一个Sequence

-- 创建表SeqT_0101001
create table SeqT_0101001(

      
-- ID列为自增列
      SeqID int identity(1,1primary key,

      
-- Sequence值
      SeqVal varchar(1)
)

-- 创建从SeqT_0101001表获取最新Sequence值的存储过程
create procedure P_GetNewSeqVal_SeqT_0101001
as
begin
      
-- 声明新Sequence值变量
      declare @NewSeqValue int

      
-- 设置插入、删除操作后的条数显示取消
      set NOCOUNT ON

      
-- 插入新值到SeqT_0101001表
      insert into SeqT_0101001 (SeqVal) values ('a')   

      
-- 设置新Sequence值为插入到SeqT_0101001表的标识列内的最后一个标识值  
      set @NewSeqValue = scope_identity()   

      
-- 删除SeqT_0101001表(不显示被锁行)
      delete from SeqT_0101001 WITH (READPAST)

-- 返回新Sequence值
return @NewSeqValue

end

--使用Sequence
Declare @NewSeqVal int
Exec @NewSeqVal =  P_GetNewSeqVal_SeqT_0101001
Print @NewSeqVal

 

要获取刚才我们提到的 “20080724000056”这种格式的话,下面这样就可以了

select Convert(char(8),Getdate(),112) + right('00000'+CAST(@NewSeqVal AS varchar(5)),5) as mySeq

 

不过还是有用的不爽的一点地方,不能直接在非存储过程的select的语句中直接使用。

 

 

 

相关实践学习
使用交互方式创建数据表
本次实验主要介绍如何在RDS-SQLServer数据库中使用交互方式创建数据表。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
12月前
|
SQL 存储 数据管理
sql server 2012远程链接的方法及步骤
sql server 2012远程链接的方法及步骤
80 0
|
PHP
php链接sqlserver的四种方法
php链接sqlserver四种方法分别是mssql、pdo-mssql、sqlsrv-pdo、sqlsrv 对应php.ini的以下4个,去掉前面的分号注释后可能需要相关的驱动文件。
613 0
php链接sqlserver的四种方法
|
SQL 数据库
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(3)
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(3)
181 0
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(3)
|
SQL
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(2)
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(2)
161 0
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(2)
|
SQL 数据库
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(1)
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(1)
551 0
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(1)
|
Go
mssql sqlserver 将字段null(空值)值替换为指定值的三种方法分享
原文:mssql sqlserver 将字段null(空值)值替换为指定值的三种方法分享 摘要: 下文将分享三种将字段中null值替换为指定值的方法分享,如下所示: 实验环境:sqlserver 2008 R2 create table test(keyId int identity,...
1358 0
|
SQL Go
mssql sqlserver 使用sql脚本检测数据表中一列数据是否连续的方法分享
原文:mssql sqlserver 使用sql脚本检测数据表中一列数据是否连续的方法分享 原文地址:http://www.maomao365.com/?p=7335   摘要:      数据表中,有一列是自动流水号,由于各种操作异常原因(或者插入失败),此列数据会变的不连续,下文将讲述使...
1009 0
|
SQL
mssql sqlserver 判断字符串大小写的方法分享
原文:mssql sqlserver 判断字符串大小写的方法分享 摘要:下文讲述使用sql脚本的方法判断字符串为大小写的方法分享,如下所示 实验环境:sqlserver 2008 R2 实现思路: 将字符串转换为大写或小写然后转换为二进制编码, 然后和源字符串做对比。
1359 0
|
SQL 存储 缓存
mssql sqlserver 批量删除所有存储过程的方法分享
原文:mssql sqlserver 批量删除所有存储过程的方法分享 转自:http://www.maomao365.com/?p=6864 摘要: 下文讲述采用sql脚本批量删除所有存储过程的方法,如下所示: 实验环境:sqlserver 2008 R2 平常使用sql脚本,删除...
995 0
|
SQL Go
项目中调试SQLServer 方便的查看SQL语句的执行时间的方法
原文:项目中调试SQLServer 方便的查看SQL语句的执行时间的方法 第一种方法,先记录执行前的时间,然后在记录执行Sql后的时间,然后做减法 第一种方法: declare @begin_date datetime declare @end_date datetime select...
1156 0
推荐文章
更多