Sql server 插入范围\插入时的标识

Sql server 插入范围\插入时的标识,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我正在使用SQLServer2008。这是我的样品台 SEQ NAME GROUP 1 abc 1 2 bcd 1 3 cde 3 在上表中,SEQ是我的标识列(自动编号)。如果我想插入一个名为'def'且组为3的新行,我可以按如下操作 INSERT INTO SampleTable(NAME, GROUP) VALUES ('def',3) 现在,如果我想插入一个新行,然后设置新插入行的GROUP=SEQ,我将分两步完成,如下所示 INSE

我正在使用SQLServer2008。这是我的样品台

 SEQ   NAME  GROUP
  1    abc   1
  2    bcd   1
  3    cde   3
在上表中,SEQ是我的标识列(自动编号)。如果我想插入一个名为'def'且组为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()仅在插入完成后设置。但是有没有办法使用一个insert语句设置GROUP=SEQ?

您可以将GROUP设置为一个计算列,并在创建表本身时将其值设置为SEQ。然后您只需插入名称,SEQ和GROUP都将自动设置。

一个小的改进是将
更新
更改为过滤
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的
序列
执行此操作,不过可以使用
插入…选择
语法。在“选择部分”中,您从序列中弹出一个数字,并将其复制到两列。

是否有任何特殊原因必须在单个命令中完成?我已编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。@YuriyGalanter-不。我只是想看看是否有更好或更优雅的方法来做到这一点,只有当组始终与SEQ相同,或者组始终可以根据SEQ计算时,这才有效。对于我的用例,它有时与SEQ相同,有时与性能改进建议不同!由于似乎无法在一个语句中完成这项工作,因此我将继续使用双语句方法,但需要您建议的改进。谢谢