插入时插入SCOPE_IDENTITY

时间:2013-05-06 16:33:26

标签: sql-server sql-server-2008 tsql

我正在使用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?

2 个答案:

答案 0 :(得分:0)

你可以将Group设为一个计算列,并在创建表本身时将其值设置为SEQ.Then你只需要插入NAME,SEQ和GROUP都将自动设置

答案 1 :(得分:0)

一项小改进是将UPDATE更改为SEQ上的过滤器:

INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',999)
UPDATE SampleTable SET GROUP = SEQ where SEQ = SCOPE_IDENTITY()

我更喜欢这个,因为我们可能通过在SEQ上过滤来获得聚集索引。另外,我认为它在语义上更清晰。

我不知道如何在IDENTITY列的一个语句中执行此操作(甚至考虑OUTPUTMERGE没有想到任何事情。您可以使用SEQUENCE语法通过SQL Server 2012 INSERT...SELECT执行此操作。在选择部分中,从序列中弹出一个数字并将其复制到两列中。