一种在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 , 1 primary   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的语句中直接使用。

 

 

 

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
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
目录
相关文章
|
PHP
php链接sqlserver的四种方法
php链接sqlserver四种方法分别是mssql、pdo-mssql、sqlsrv-pdo、sqlsrv 对应php.ini的以下4个,去掉前面的分号注释后可能需要相关的驱动文件。
676 0
php链接sqlserver的四种方法
|
数据库
SQLSERVER查询整个数据库中某个特定值所在的表和字段的方法
SQLSERVER查询整个数据库中某个特定值所在的表和字段的方法
341 0
|
SQL 存储 数据管理
sql server 2012远程链接的方法及步骤
sql server 2012远程链接的方法及步骤
98 0
|
SQL 数据库
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(3)
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(3)
209 0
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(3)
|
SQL
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(2)
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(2)
177 0
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(2)
|
SQL 数据库
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(1)
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(1)
624 0
Sqlserver高版本还原到低版本方法(Sqlserver2012到SqlServer2008 R2)(1)
|
SQL
mssql sqlserver 判断字符串大小写的方法分享
原文:mssql sqlserver 判断字符串大小写的方法分享 摘要:下文讲述使用sql脚本的方法判断字符串为大小写的方法分享,如下所示 实验环境:sqlserver 2008 R2 实现思路: 将字符串转换为大写或小写然后转换为二进制编码, 然后和源字符串做对比。
1372 0
|
SQL Go
mssql sqlserver 使用sql脚本检测数据表中一列数据是否连续的方法分享
原文:mssql sqlserver 使用sql脚本检测数据表中一列数据是否连续的方法分享 原文地址:http://www.maomao365.com/?p=7335   摘要:      数据表中,有一列是自动流水号,由于各种操作异常原因(或者插入失败),此列数据会变的不连续,下文将讲述使...
1051 0
|
Go
mssql sqlserver 将字段null(空值)值替换为指定值的三种方法分享
原文:mssql sqlserver 将字段null(空值)值替换为指定值的三种方法分享 摘要: 下文将分享三种将字段中null值替换为指定值的方法分享,如下所示: 实验环境:sqlserver 2008 R2 create table test(keyId int identity,...
1401 0
|
SQL 存储 缓存
mssql sqlserver 批量删除所有存储过程的方法分享
原文:mssql sqlserver 批量删除所有存储过程的方法分享 转自:http://www.maomao365.com/?p=6864 摘要: 下文讲述采用sql脚本批量删除所有存储过程的方法,如下所示: 实验环境:sqlserver 2008 R2 平常使用sql脚本,删除...
1027 0