11

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

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

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

如何在 SQLServer 中完成此操作?

奖励:好的,到目前为止答案很好,但是如果可能的话,我如何将它放入一个语句中?:)

4

7 回答 7

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

于 2009-06-10T16:17:06.993 回答
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')
于 2009-06-10T16:09:32.157 回答
4

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

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

于 2009-06-10T16:11:44.900 回答
2

SCOPE_IDENTITY

于 2009-06-10T16:10:17.507 回答
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 参数返回值。

于 2009-06-10T21:02:18.260 回答
0

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

于 2009-06-10T16:16:14.733 回答
0

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

于 2009-06-10T16:17:43.107 回答