在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提供的确切功能.
没有完全匹配.
等效的是IDENTITY,您可以在创建表时将其设置为数据类型.SQLSERVER将在插入期间自动创建运行序列号.最后插入的值可以通过调用SCOPE_IDENTITY()或通过查询系统变量@@ IDENTITY(由Frans指出)获得
如果您需要完全等效的,则需要创建一个表,然后编写一个过程以重新调整下一个值和其他操作.请参阅Marks对此陷阱的回应.
编辑:
SQL Server已经实现了类似于Oracle的Sequence.有关详细信息,请参阅此问题.
您将如何在Microsoft SQL Server中实现序列?
身份是最好和最具伸缩性的解决方案,但是,如果您需要一个不是递增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那里学到了一切.
使该字段成为标识字段.该字段将自动获取其值.您可以通过调用SCOPE_IDENTITY()或咨询系统变量@@ IDENTITY来获取最后插入的值
SCOPE_IDENTITY()函数是首选.