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

发布于 2024-07-24 05:11:40 字数 372 浏览 2 评论 0原文

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

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

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

如何在 SQLServer 中完成此操作?

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

I'm inserting into an SQLServer table with an autoincrementing key field. (I believe this is called an IDENTITY column in SQLServer.)

In Oracle, I can use the RETURNING keyword to give my INSERT statement a results set like a SELECT query that will return the generated value:

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

How do I accomplish this in SQLServer?

Bonus: Okay, nice answers so far, but how do I put it into a single statement, if possible? :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

初心未许 2024-07-31 05:11:42

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

You can use OUTPUT INTO, which has the additional benefits of being able to capture multiple identities inserted.

楠木可依 2024-07-31 05:11:42

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

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

朕就是辣么酷 2024-07-31 05:11:41

一般来说,这不可能通过一条语句来完成。

但是 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

In general, it can't be done in a single statement.

But the SELECT SCOPE_IDENTITY() can (and should) be placed directly after the INSERT statement, so it's all done in the same database call.

Example:

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

You can use OUTPUT, but it has some limitations you should be aware of:

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

不念旧人 2024-07-31 05:11:41
SELECT SCOPE_IDENTITY()

编辑:玩一玩...

如果仅支持 OUTPUT 子句局部变量。

无论如何,要获取一系列 ID 而不是单个 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')
SELECT SCOPE_IDENTITY()

Edit: Having a play...

If only the OUTPUT clause supported local variables.

Anyway, to get a range of IDs rather than a singleton

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'

Edit 2: In one call. I've never had occasion to use this construct.

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

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol
VALUES('foobar')
_失温 2024-07-31 05:11:41

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

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

In addition to @@IDENTITY, you should also look into SCOPE_IDENTITY() and IDENT_CURRENT(). You most likely want SCOPE_IDENTITY(). @@IDENTITY has a problem in that it might return an identity value created in a trigger on the actual table that you're trying to track.

Also, these are single-value functions. I don't know how the Oracle RETURNING keyword works.

ぇ气 2024-07-31 05:11:41

范围标识

SCOPE_IDENTITY

小苏打饼 2024-07-31 05:11:41

这取决于您的调用上下文。

如果您从客户端代码调用此函数,则可以使用 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 参数返回值。

It depends on your calling context.

If you're calling this from client code, you can use OUTPUT and then read the value returned.

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

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

Result:

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

If you're wrapping this in a stored procedure, using OUTPUT is more work. There, you'll want to use SCOPE_IDENTITY(), but you can't do it in a single statement. Sure, you can put multiple statements on a single line with a ';' separator, but that's not a single statement.

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

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

SELECT @idValue = SCOPE_IDENTITY()

Result: @idValue variable contains identity value. Use an OUTPUT parameter to return the value.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文