加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:41:44 所属栏目:MsSql教程 来源:网络整理
导读:我试图写一个存储过程,首先将新记录插入到表中,然后返回这个新记录的id.我不知道这是否是正确的方式和实现这个的最好方法. ALTER PROCEDURE dbo.spAddAsset(@Name VARCHAR(500),@URL VARCHAR(2000))ASBEGINSet NOCOUNT on;Insert Into Assets (Name,URL) Valu
我试图写一个存储过程,首先将新记录插入到表中,然后返回这个新记录的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没有出现修复.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读