在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提供的确切功能。
发布于 2009-03-19 12:24:32
没有完全匹配的。
等效的是IDENTITY,您可以在创建表时设置为数据类型。SQLSERVER将在插入过程中自动创建一个运行序列号。最后插入的值可以通过调用SCOPE_IDENTITY()或通过查询系统变量@@IDENTITY来获得(如Frans所指出的)
如果您需要精确的等价物,则需要创建一个表,然后编写一个过程来返回下一个值和其他操作。请参阅Marks response on this on这一点。
编辑:
SQL Server已经实现了类似于Oracle的序列。有关更多详细信息,请参阅此问题。
发布于 2009-07-29 04:34:00
Identity是最好的和最具伸缩性的解决方案,但是,如果您需要一个不是递增int的序列,比如00A、00B、00C或一些特殊的序列,那么还有一种次佳的方法。如果实现正确,它的伸缩性还可以,但如果实现得不好,它的伸缩性就很差。我不愿推荐它,但你要做的是:
特殊的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那里学到的。
发布于 2009-03-19 12:25:18
使该字段成为标识字段。该字段将自动获取其值。可以通过调用SCOPE_IDENTITY()或查询系统变量@@IDENTITY来获取上次插入的值
最好使用SCOPE_IDENTITY()函数。
https://stackoverflow.com/questions/661998
复制相似问题