如何从SQLServer SELECT语句返回新的IDENTITY列值?

ski*_*ppy 11 sql t-sql sql-server identity auto-increment

我正在插入带有自动增量键字段的SQLServer表.(我相信这在SQLServer中称为IDENTITY列.)

在Oracle中,我可以使用RETURNING关键字为我的INSERT语句提供一个结果集,就像SELECT查询一样,它将返回生成的值:

INSERT INTO table
(foreign_key1, value)
VALUES
(9, 'text')
RETURNING key_field INTO :var;
Run Code Online (Sandbox Code Playgroud)

如何在SQLServer中完成此操作?

额外奖励:好的,到目前为止答案很好,但如果可能的话,如何将其写入单一陈述?:)

ric*_*ent 17

一般来说,它不能在一个声明中完成.

但SELECT SCOPE_IDENTITY()可以(并且应该)直接放在INSERT语句之后,因此它们都在同一个数据库调用中完成.

例:

mydb.ExecuteSql("INSERT INTO table(foreign_key1, value) VALUES(9, 'text'); SELECT SCOPE_IDENTITY();");
Run Code Online (Sandbox Code Playgroud)

您可以使用OUTPUT,但它有一些您应该注意的限制:

http://msdn.microsoft.com/en-us/library/ms177564.aspx

  • 难以置信.我不知道我可以合并这样的陈述.聪明,非标准,丑陋,有用......所有这些形容词都浮现在脑海中.:) (4认同)

gbn*_*gbn 9

SELECT SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)

编辑:玩游戏......

如果只有OUTPUT子句支持局部变量.

无论如何,要获得一系列ID而不是单身

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50))

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol
SELECT 'harry'
UNION ALL
SELECT 'dick'
UNION ALL
SELECT 'tom'
Run Code Online (Sandbox Code Playgroud)

编辑2:在一个电话中.我从来没有机会使用这个结构.

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50))

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol
VALUES('foobar')
Run Code Online (Sandbox Code Playgroud)