我正在使用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?
答案 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
列的一个语句中执行此操作(甚至考虑OUTPUT
和MERGE
没有想到任何事情。您可以使用SEQUENCE
语法通过SQL Server 2012 INSERT...SELECT
执行此操作。在选择部分中,从序列中弹出一个数字并将其复制到两列中。