`

SQLServer实现Oracle的Sequence

阅读更多
http://database.51cto.com/art/201007/210471.htm


此文章主要讲述的是SQLServer实现Oracle的Sequence,如果大家在Oracle数据库里面用惯了Sequence,要在SQLServe数据库中实现Sequence,就会发现没有现成的Sequence对象可以Create了。那应该怎么办呢?

当然这点小问题是难不倒我们程序员的,“max+1啊”,有人会说这样的方式。是的,这种方式SQLServer实现起来也比较简单。当然你也许还会说,最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,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()

--如果组合的Sequence值<999999999(大于的话数值会溢出),如:“YYYY”+5位的Sequence值(201019988),可以采用下面的方式来SQLServer实现

--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)
分享到:
评论

相关推荐

    sqlserver实现oracle的sequence方法

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

    从SQLSERVER向ORACLE8迁移的技术实现方案

    包括数据类型、ID列向SEQUENCE迁移、表(主键、外键、CHECK、UNIQUE、DEFAULT、INDEX)、游标、存储过程、函数、触发器、常用SQL语法与函数几个方面,考虑SQLSERVER的实际情况,没有涉及ORACLE特有的PACKAGE、...

    ORACLE SEQUENCE的简单介绍

    Sql Server 数据库,插入操作时可以设置,自动编号。但是ORACLE 数据库,具有里一个东西SEQUENCE,在这儿介绍

    Oracle 实现类似SQL Server中自增字段的一个办法

    创建sequence: 代码如下:CREATE SEQUENCE SEQU_DATA_DATAINFO INCREMENT BY 1 START WITH 1 NOCYCLE NOCACHE NOORDER; 2. 创建触发器: 代码如下:create or replace TRIGGER TRIG_TEST BEFORE INSERT ON TABLE1 ...

    Oracle创建自增字段sequence

    Oracle中没有sqlserver中那么方便的自增序列,如果想要达到sqlserver中那种效果,也不是很麻烦,需要创建一个自增序列SEQUENCE,然后建一个触发器即可。  CREATE SEQUENCE emp_sequence  INCREMENT BY 1 — ...

    Oracle、DB2、PostgreSQL之Sequence总结

    Sequence是数据库系统按照一定规则自动增加的数字序列。这个序列一般作为代理主键(因为不会重复),没有其他任何...比如Oracle、DB2、PostgreSQL数据库有Sequence,MySQL、SQL Server、Sybase等数据库没有Sequence。

    SQL Server2012在开发中的一些新特性

    这个对于Oracle用户来说是最熟悉不过的数据库对象了,现在在SQL Server中终于也看到了类似的对象,只是在使用的语法上有一点点不一样。创建语法也是CREATE SEQUENCE,使用的时候需要使用NEXT VALUE FOR来取下一个值...

    Oracle_Data_Integrator应用指南

    4.1. Oracle to SQL Server 45 4.2. SQL Server to Oracle 46 4.3. XML to Oracle 47 5. Sequence、Variable、User Function、Procedure 50 5.1. 作用域 50 5.2. Variable变量 50 5.3. Sequence序列 51 5.4. User ...

    Oracle中使用触发器(trigger)和序列(sequence)模拟实现自增列实例

    问题:在SQL Server数据库中,有自增列这个字段属性,使用起来也是很方便的。而在Oracle中却没有这个功能,该如何实现呢? 答:在Oracle中虽然没有自增列的说法,但却可以通过触发器(trigger)和序列(sequence)来模式...

    最全的oracle常用命令大全.txt

    ORACLE常用命令 一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle&gt;svrmgrl SVRMGR&gt;connect internal SVRMGR&gt;startup ...

    The Language of SQL(Addison,2ed,2016)

    Finally, this book covers the syntax of three widely used databases: Microsoft SQL Server, MySQL, and Oracle. Special “Database Differences” sidebars clearly show you any differences in syntax among...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。  拉里•埃里森  就业前景 从就业与择业的...

    ORACLE数据库基础知识-华为维护资料

    3.18 如何设置ORACLE PARALLEL SERVER 49 3.18.1 HOSTS文件 50 3.18.2 OGMS的LST文件 51 3.18.3 LISTENER.ORA文件 51 3.18.4 INITORA8.ORA文件 52 第4章 常见问题处理 54 4.1 增大Processes参数后数据库不能启动 54 ...

    The.Language.of.SQL.2nd.Edition.0134658256

    Finally, this book covers the syntax of three widely used databases: Microsoft SQL Server, MySQL, and Oracle. Special “Database Differences” sidebars clearly show you any differences in syntax among...

    MybatisGeneratorPlus.zip

    扩展 Mybatis-Generator,自动生成支持 Oracle、Mysql、Sqlserver 分页查询和批量插入操作的自动代码,支持从 Mapper 接口读取数据源名称;支持 Oracle 使用 SEQUENCE 实现自增主键:需要事先建立好表主键对应的...

    sql 主键自增

    在mysql中,直接把表的主键设为auto_increment类型,在MS SQLServer中,如果把表的主键设为identity类型, 在Oracle中,可以为每张表的主键创建一个单独的序列,然后从这个序列中获取自动增加的标识符,把它赋值给...

    StrutsNews

    static private String strUrl = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; static private String strUser = "scmgroup2"; static private String strPwd = "123"; MYSQL的: static ...

Global site tag (gtag.js) - Google Analytics