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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 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
目录
相关文章
|
6月前
|
SQL 存储 BI
sql server 2012远程链接的方法及步骤
sql server 2012远程链接的方法及步骤
|
2月前
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
32 4
|
SQL 存储 数据库
【SQL Server】数据库开发指南(六)索引和视图的使用技巧、方法与综合应用
索引就是数据表中数据和相应的存储位置的列表,利用索引可以提高在表或视图中的查找数据的速度。它类似于书籍的索引,可以帮助快速定位和检索数据。在数据库中,索引是对一个或多个列的值进行排序和存储的结构,它们包含指向实际数据位置的指针。视图就是一个虚拟的数据表,该数据表中的数据记录是由一条查询语句的查询结果得到的。
296 1
【SQL Server】数据库开发指南(六)索引和视图的使用技巧、方法与综合应用
|
SQL 搜索推荐 关系型数据库
Windows 系统彻底卸载 SQL Server 通用方法
Windows 系统彻底卸载 SQL Server 通用方法
728 0
Windows 系统彻底卸载 SQL Server 通用方法
|
SQL Oracle 关系型数据库
一种SqlServer数据迁移到Oracle的方法总结
一种SqlServer数据迁移到Oracle的方法总结
498 0
|
SQL
[ SQL Server ] 计算N个月前,N个月后的方法
#1. 计算N个月前的日期 #2. 计算N个月后的日期 #3. 月末最后一天的情况(计算从日数多的月到日数较少的月) #4. 月末最后一天的情况(计算从日数少的月到日数较多的月)
188 0
[ SQL Server ] 计算N个月前,N个月后的方法
|
存储 SQL 数据库
查询SQL server状态的三种方法
查询SQL server状态的三种方法
|
SQL 安全 数据库
SQL Server附加数据库的方法,及出现错误的解决办法(错误:5123)
SQL Server附加数据库的方法,及出现错误的解决办法(错误:5123)
|
SQL Oracle 关系型数据库
SQL Server2019数据库查询所有数据库名、表名、表结构、表字段、主键方法演示,执行sql提示对象名‘user_tab_columns‘、 ‘user_cons_columns‘ 无效问题解决
SQL Server2019数据库查询所有数据库名、表名、表结构、表字段、主键方法演示,执行sql提示对象名‘user_tab_columns‘、 ‘user_cons_columns‘ 无效问题解决
451 0
|
数据库
SQLSERVER查询整个数据库中某个特定值所在的表和字段的方法
SQLSERVER查询整个数据库中某个特定值所在的表和字段的方法
460 0
下一篇
无影云桌面