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

时间:2009-06-10 16:07:25

标签: sql sql-server tsql identity auto-increment

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

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

INSERT INTO table
(foreign_key1, value)
VALUES
(9, 'text')
RETURNING key_field INTO :var;

如何在SQLServer中完成此任务?

奖金:好的,到目前为止答案很好,但如果可能的话,如何将其放入单个声明中? :)

7 个答案:

答案 0 :(得分:17)

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

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

示例:

mydb.ExecuteSql("INSERT INTO table(foreign_key1, value) VALUES(9, 'text'); SELECT SCOPE_IDENTITY();");

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

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

答案 1 :(得分:9)

SELECT SCOPE_IDENTITY()

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

如果只有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'

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

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

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol
VALUES('foobar')

答案 2 :(得分:4)

除了@@ IDENTITY之外,您还应该查看SCOPE_IDENTITY()和IDENT_CURRENT()。你最有可能想要SCOPE_IDENTITY()。 @@ IDENTITY存在一个问题,即它可能会返回在您尝试跟踪的实际表上的触发器中创建的标识值。

此外,这些是单值函数。我不知道Oracle RETURNING关键字是如何工作的。

答案 3 :(得分:2)

SCOPE_IDENTITY

答案 4 :(得分:2)

这取决于你的呼叫背景。

如果您是从客户端代码调用此函数,则可以使用OUTPUT然后读取返回的值。

DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20))

INSERT INTO @t (ColStr)
OUTPUT Inserted.ColID
VALUES ('Hello World')

结果:

      ColID
-----------
          1

如果要将其包装在存储过程中,则使用OUTPUT会更有效。在那里,您将要使用SCOPE_IDENTITY(),但不能在单个语句中执行此操作。当然,你可以用一个';'将多个语句放在一行上分隔符,但这不是单个语句。

DECLARE @idValue    int
DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20))

INSERT INTO @t (ColStr) VALUES ('Hello World')

SELECT @idValue = SCOPE_IDENTITY()

结果:@idValue变量包含标识值。使用OUTPUT参数返回值。

答案 5 :(得分:0)

您可以使用OUTPUT INTO,它具有捕获插入的多个身份的额外好处。

答案 6 :(得分:0)

INSERT INTO表(foreign_key1,value)VALUES(9,'text'); SELECT @@ IDENTITY;