如何从 SQLServer SELECT 语句返回新的 IDENTITY 列值?
我正在插入带有自动增量键字段的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
您可以使用OUTPUT INTO,它的额外好处是能够捕获插入的多个身份。
You can use OUTPUT INTO, which has the additional benefits of being able to capture multiple identities inserted.
INSERT INTO 表(foreign_key1, value)VALUES(9, 'text');SELECT @@IDENTITY;
INSERT INTO table(foreign_key1, value)VALUES(9, 'text');SELECT @@IDENTITY;
一般来说,这不可能通过一条语句来完成。
但是 SELECT SCOPE_IDENTITY() 可以(并且应该)直接放在 INSERT 语句之后,因此这一切都在同一个数据库调用中完成。
示例:
您可以使用 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:
You can use OUTPUT, but it has some limitations you should be aware of:
http://msdn.microsoft.com/en-us/library/ms177564.aspx
编辑:玩一玩...
如果仅支持 OUTPUT 子句局部变量。
无论如何,要获取一系列 ID 而不是单个 ID
编辑 2:在一次调用中。 我从来没有机会使用这个结构。
Edit: Having a play...
If only the OUTPUT clause supported local variables.
Anyway, to get a range of IDs rather than a singleton
Edit 2: In one call. I've never had occasion to use this construct.
除了 @@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.
范围标识
SCOPE_IDENTITY
这取决于您的调用上下文。
如果您从客户端代码调用此函数,则可以使用 OUTPUT,然后读取返回的值。
结果:
如果您将其包装在存储过程中,则使用 OUTPUT 会需要更多工作。 在那里,您需要使用 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.
Result:
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.
Result: @idValue variable contains identity value. Use an OUTPUT parameter to return the value.