1

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

4

2 回答 2

0

您可以在创建表本身时将 Group 设为计算列并将其值设置为 SEQ。然后您只需要插入 NAME 并且 SEQ 和 GROUP 都会自动设置

于 2013-05-06T16:39:23.540 回答
0

一个小的改进是改变UPDATE过滤器SEQ

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

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

我不知道有什么方法可以在一个带有IDENTITY专栏的声明中做到这一点(即使在想OUTPUTMERGE没有想到)。您可以使用 SQL Server 2012 执行此操作,SEQUENCE但可以使用INSERT...SELECT语法。在选择部分,您从序列中弹出一个数字并将其复制到两列中。

于 2013-05-06T17:59:31.317 回答