当前位置:  开发笔记 > 前端 > 正文

Oracle序列,但随后在MS SQL Server中

如何解决《Oracle序列,但随后在MSSQLServer中》经验,为你挑选了3个好方法。

在Oracle中,有一种生成序列号的机制,例如:

CREATE SEQUENCE supplier_seq

    MINVALUE 1
    MAXVALUE 999999999999999999999999999
    START WITH 1
    INCREMENT BY 1
    CACHE 20;

然后执行该语句

supplier_seq.nextval

检索下一个序列号.

您将如何在MS SQL Server中创建相同的功能?

编辑:我不是在寻找自动生成表记录密钥的方法.我需要生成一个唯一值,我可以将其用作进程的(逻辑)ID.所以我需要Oracle提供的确切功能.



1> Dheer..:

没有完全匹配.

等效的是IDENTITY,您可以在创建表时将其设置为数据类型.SQLSERVER将在插入期间自动创建运行序列号.最后插入的值可以通过调用SCOPE_IDENTITY()或通过查询系统变量@@ IDENTITY(由Frans指出)获得

如果您需要完全等效的,则需要创建一个表,然后编写一个过程以重新调整下一个值和其他操作.请参阅Marks对此陷阱的回应.

编辑:
SQL Server已经实现了类似于Oracle的Sequence.有关详细信息,请参阅此问题.

您将如何在Microsoft SQL Server中实现序列?



2> onupdatecasc..:

身份是最好和最具伸缩性的解决方案,但是,如果您需要一个不是递增int的序列,如00A,00B,00C或某些特殊序列,则有第二好的方法.如果正确实现,它可以扩展正常,但如果实施得很糟糕,它会严重缩放.我犹豫推荐它,但你做的是:

    您必须将"下一个值"存储在表中.该表可以是一个简单的,一行,一列的表,只有该值.如果您有多个序列,他们可以共享该表,但您可以通过为每个表分别使用表来减少争用.

    您需要编写一个更新语句,将该值递增1个间隔.您可以将更新放在存储过程中,以使其易于使用,并防止在不同位置的代码中重复它.

    正确使用序列,以便它可以合理地缩放(不,不像Identitiy :-)需要两件事:a.update语句具有针对此确切问题的特殊语法,该语法将在单个语句中递增并返回值; 湾 您必须在事务开始之前和事务范围之外从自定义序列中获取值.这就是身份扩展的一个原因 - 无论事务范围如何,它都会返回一个新值,对于任何尝试插入,但不会在失败时回滚.这意味着它不会阻止,也意味着你将失败的交易存在空白.

特殊更新语法因版本而略有不同,但要点是您在同一语句中对变量和更新进行了分配.对于2008年,Itzik Ben-Gan有这个简洁的解决方案:http://www.sqlmag.com/Articles/ArticleID/101339/101339.html?Ad = 1

老派2000及以后的方法如下所示:

UPDATE SequenceTable SET @localVar = value = value + 5 - 将尾端更改为增量逻辑

这将增加并返回下一个值.

如果你绝对不能有差距(抵制那个要求:-)那么技术上可以将更新或proc放在你的其余部分中,但是当每个insert等待前一个提交时,你会受到大的并发攻击.

我不能相信这一点; 我从Itzik那里学到了一切.



3> Frans Bouma..:

使该字段成为标识字段.该字段将自动获取其值.您可以通过调用SCOPE_IDENTITY()或咨询系统变量@@ IDENTITY来获取最后插入的值

SCOPE_IDENTITY()函数是首选.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有