我试图写一个存储过程,首先将新记录插入到表中,然后返回这个新记录的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没有出现修复.