Ray*_*ond 14 sql-server oracle sequence
在Oracle中,有一种生成序列号的机制,例如:
CREATE SEQUENCE supplier_seq
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 20;
Run Code Online (Sandbox Code Playgroud)
然后执行该语句
supplier_seq.nextval
Run Code Online (Sandbox Code Playgroud)
检索下一个序列号.
您将如何在MS SQL Server中创建相同的功能?
编辑:我不是在寻找自动生成表记录密钥的方法.我需要生成一个唯一值,我可以将其用作进程的(逻辑)ID.所以我需要Oracle提供的确切功能.
Dhe*_*eer 15
没有完全匹配.
等效的是IDENTITY,您可以在创建表时将其设置为数据类型.SQLSERVER将在插入期间自动创建运行序列号.最后插入的值可以通过调用SCOPE_IDENTITY()或通过查询系统变量@@ IDENTITY(由Frans指出)获得
如果您需要完全等效的,则需要创建一个表,然后编写一个过程以重新调整下一个值和其他操作.请参阅Marks对此陷阱的回应.
编辑:
SQL Server已经实现了类似于Oracle的Sequence.有关详细信息,请参阅此问题.
您将如何在Microsoft SQL Server中实现序列?
身份是最好和最具伸缩性的解决方案,但是,如果您需要一个不是递增int的序列,如00A,00B,00C或某些特殊序列,则有第二好的方法.如果正确实现,它可以扩展正常,但如果实施得很糟糕,它会严重缩放.我犹豫推荐它,但你做的是:
特殊更新语法因版本而略有不同,但要点是您在同一语句中对变量和更新进行了分配.对于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()函数是首选.
归档时间: |
|
查看次数: |
21267 次 |
最近记录: |