在插入时插入 SCOPE_IDENTITY
Posted
技术标签:
【中文标题】在插入时插入 SCOPE_IDENTITY【英文标题】:Insert SCOPE_IDENTITY at time of insert 【发布时间】:2013-05-06 16:33:25 【问题描述】:我使用的是 SQL Server 2008。这是我的示例表
SEQ NAME GROUP
1 abc 1
2 bcd 1
3 cde 3
在上表中,SEQ 是我的身份列(自动编号)。如果我想插入一个 name = 'def' 和 group = 3 的新行,我可以这样做
INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',3)
现在,如果我想插入一个新行,然后设置新插入行的 GROUP = SEQ,我分两步进行,如下所示
INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',999)
UPDATE SampleTable SET GROUP = SEQ where NAME = 'def'
有什么方法可以一步完成吗?例如
INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',SCOPE_IDENTITY())
上述语句显然不起作用,因为 SCOPE_IDENTITY() 仅在插入完成后设置。但是有没有办法使用单个插入语句来设置 GROUP = SEQ?
【问题讨论】:
有什么特殊原因必须在单个命令中完成? 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 @YuriyGalanter - 不。我只是想看看是否有更好或更优雅的方法来做到这一点 【参考方案1】:一个小的改进是将UPDATE
更改为过滤SEQ
:
INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',999)
UPDATE SampleTable SET GROUP = SEQ where SEQ = SCOPE_IDENTITY()
我更喜欢这个,因为我们很可能通过过滤SEQ
来获得聚集索引搜索。另外,我认为它在语义上更清晰。
我不知道有什么方法可以在一个带有IDENTITY
列的语句中做到这一点(即使想到OUTPUT
和MERGE
也没有想到)。您可以使用 SQL Server 2012 SEQUENCE
来完成此操作,但可以使用 INSERT...SELECT
语法。在选择部分,您从序列中弹出一个数字并将其复制到两列中。
【讨论】:
我喜欢性能改进建议!由于似乎没有办法在单个语句中执行此操作,因此我将继续使用双语句方法,但会根据您的建议进行改进。谢谢!【参考方案2】:您可以在创建表时将 Group 设置为计算列,并将其值设置为 SEQ。然后您只需插入 NAME,SEQ 和 GROUP 都会自动设置
【讨论】:
只有当 GROUP 始终与 SEQ 相同或 GROUP 始终可以从 SEQ 计算时才有效。对于我的用例,它有时可能与 SEQ 相同,有时可能不同以上是关于在插入时插入 SCOPE_IDENTITY的主要内容,如果未能解决你的问题,请参考以下文章