惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
博客园_首页
J
Java Code Geeks
Jina AI
Jina AI
B
Blog RSS Feed
量子位
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
L
LangChain Blog
Microsoft Security Blog
Microsoft Security Blog
小众软件
小众软件
博客园 - 聂微东
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
Last Week in AI
Last Week in AI
MongoDB | Blog
MongoDB | Blog
I
InfoQ
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
爱范儿
爱范儿
Y
Y Combinator Blog
Vercel News
Vercel News
雷峰网
雷峰网

博客园 - 飛雪飄寒

【共享】十步优化SQL Server中的数据访问 【推荐】SQL优化-索引 【推荐】SQL CookBook OLAP函数的使用 通过HttpModule、httpHandlers防止SQL注入式攻击 .net导出excel文件操作类续 【分享】Tomcat服务器之安全设置 【分享】.net1.1调用webservice返回二维数组时提示“XML 文档(1, 378)中有错误”的解决方法! .net页面之间传值方式小结 - 飛雪飄寒 - 博客园 【共享】将程序制作为服务运行的方法! 【推荐】.NET使用NPOI组件将数据导出Excel 【推荐】Quest.Central.For.Databases——Spotlight的使用 【推荐】[SQL优化工具]Quest.Central.For.Databases——SQL Tuning for SQL Server 【共享】解决“无法显示进程。没有正确安装调试器。请运行安装程序安装或修复调试器。”错误的方法。 【求助】使用SQL语句优化工具遇到的问题 【求助】软考报名即将开始,信息系统项目管理师、系统分析师、系统架构设计师——如何选择? 【探讨】索引视图如何提高性能 .net实现将Excel中的数据导入数据库 【学习】NeatUpload——支持大文件上传的控件
在SQLServer中实现ORACLE的Sequence
飛雪飄寒 · 2010-07-07 · via 博客园 - 飛雪飄寒

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

当然这点小问题是难不倒我们程序员的,“max+1啊”,有人会说这样的方式。是的,这种方式实现起来也比较简单。当然你也许还会说,最Sql的方式是采用identity列,自增的方式去增加就ok了。但是这样的列如果要实现“YYYYMMDD”+“部门编号(如ZX)”+Sequence值 (例如:20100707ZX000002)的格式就不行了。还是老老实实用存储过程来取得一个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()   

      --如果组合的Sequence值<999999999(大于的话数值会溢出),如:“YYYY”+5位的Sequence值(201019988),可以采用下面的方式来实现
      --set @NewSeqValue = Convert(char(4),Getdate(),112) + right('00000'+CAST(scope_identity() AS varchar(5)),5)
      --这样直接Print @NewSeqVal 就可以得到类似“201019988”的Sequence值


      
-- 删除SeqT_0101001表(不显示被锁行)
      delete from SeqT_0101001 WITH (READPAST)-- 返回新Sequence值
return @NewSeqValueend--使用Sequence
Declare @NewSeqVal int
Exec @NewSeqVal =  P_GetNewSeqVal_SeqT_0101001
Print @NewSeqVal
Print Convert(char(8),Getdate(),112) +'ZX'+ right('000000'+CAST(@NewSeqVal AS varchar(5)),6)


要获取刚才我们提到的 “20100707ZX000002”这种格式的话,下面这样就可以了
Print Convert(char(8),Getdate(),112) +'ZX'+ right('000000'+CAST(@NewSeqVal AS varchar(5)),6)

缺点:不能直接在非存储过程的select的语句中直接使用。

信息来源:http://www.cnblogs.com/heekui/archive/2008/07/24/1250842.html