首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle序列,但在MS SQL Server中

问Oracle序列,但在MS SQL Server中
EN

Stack Overflow用户
提问于 2009-03-19 12:19:37
回答 10查看 21.6K关注 0票数 14

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

代码语言:javascript
复制
CREATE SEQUENCE supplier_seq

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

然后执行以下语句

代码语言:javascript
复制
supplier_seq.nextval

来检索下一个序列号。

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

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

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-03-19 12:24:32

没有完全匹配的。

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

如果您需要精确的等价物,则需要创建一个表,然后编写一个过程来返回下一个值和其他操作。请参阅Marks response on this on这一点。

编辑:

SQL Server已经实现了类似于Oracle的序列。有关更多详细信息,请参阅此问题。

How would you implement sequences in Microsoft SQL Server?

票数 15
EN

Stack Overflow用户

发布于 2009-07-29 04:34:00

Identity是最好的和最具伸缩性的解决方案,但是,如果您需要一个不是递增int的序列,比如00A、00B、00C或一些特殊的序列,那么还有一种次佳的方法。如果实现正确,它的伸缩性还可以,但如果实现得不好,它的伸缩性就很差。我不愿推荐它,但你要做的是:

  1. 你必须将"next value“存储在表中。该表可以是一个简单的单行单列表,其中只包含该值。如果您有多个序列,则它们可以共享表,但通过为每个序列使用单独的表,可能会减少争用。
  2. 您需要编写一条update语句,该语句将以1个间隔递增该值。您可以将更新放在存储的proc中,以使其易于使用,并防止在不同位置的代码中重复它。
  3. 正确使用序列,以便它将合理缩放(不,不以及标识:-)需要两件事: a. update语句有一个专门针对此问题的特殊语法,它将在单个语句中递增并返回值;b.您必须在事务开始之前和事务范围之外从自定义序列中获取值。这是Identity扩展的一个原因--对于任何尝试的insert,无论事务范围如何,它都会返回一个新值,但在失败时不会回滚。这意味着它不会阻塞,也意味着您将为失败的事务留出间隙。

特殊的update语法因版本的不同而略有不同,但要点是在同一个语句中对变量和update进行赋值。对于2008年,Itzik Ben-Gan有一个巧妙的解决方案:http://www.sqlmag.com/Articles/ArticleID/101339/101339.html?Ad=1

老式的2000和更高版本的方法如下所示:

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

这既会递增,也会返回下一个值。

如果您绝对不能有空隙(拒绝要求:-),那么在技术上可以将更新或处理放在事务操作其余部分中,但由于每个插入操作都等待前一个插入操作提交,因此会对并发造成很大的影响。

这不是我的功劳,我都是从Itzik那里学到的。

票数 6
EN

Stack Overflow用户

发布于 2009-03-19 12:25:18

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

最好使用SCOPE_IDENTITY()函数。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/661998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档