微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql-server – 需要一个插入行并返回ID的存储过程

我试图写一个存储过程,首先将新记录插入到表中,然后返回这个新记录的id.我不知道这是否是正确的方式和实现这个的最好方法.
ALTER PROCEDURE dbo.spAddAsset
(
@Name VARCHAR(500),@URL VARCHAR(2000)
)
AS
BEGIN
Set NOCOUNT on;

Insert Into Assets (Name,URL) Values (@Name,@URL)

Declare @new_identity int;

SELECT @new_identity = ScopE_IDENTITY()

return @new_identity;
END

解决方法

要将单个标量值返回给调用者,您应该使用OUTPUT参数,而不是RETURN. RETURN是错误/状态代码.前缀sp也是冗余和不必要的.
CREATE PROCEDURE dbo.AddAsset
  @Name VARCHAR(500),@URL  VARCHAR(2000),@new_identity INT = NULL OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT dbo.Assets(Name,URL) SELECT @Name,@URL;
    SET @new_identity = ScopE_IDENTITY();
END
GO

然后叫它:

DECLARE @new_identity INT;
EXEC dbo.AddAsset @Name = 'a',@URL = 'b',@new_identity = @new_identity OUTPUT;
PRINT @new_identity;

编辑只是添加一个免责声明,这不会影响在这个具体情况下的发件人,但可能有助于其他情况或未来的读者.在sql Server 2008 R2及更早版本中,当使用并行度来导出要插入的结果时,会有一个内置函数(如ScopE_IDENTITY)的potentially nasty bug(从INSERT FROM othertable).这个bug(here is the Connect item)在Cumulative Update #5 for SQL Server 2008 R2 SP1固定,但到目前为止,2008 R2 RTM,2008或2005没有出现修复.

原文地址:https://www.jb51.cc/mssql/81462.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐