我正在使用execute sp_executesql
在sp中执行插入查询。执行查询,插入正确。之后我使用scope indentity()
,将值设置为一个输出段。但是我收到了错误:
procedure attempted to return a status of NULL, which is not allowed. A status of 0 will be returned instead.
如何解决?有人有想法吗?
答案 0 :(得分:1)
SCOPE_IDENTITY()
函数返回在当前范围中插入的最后一个标识值。使用EXEC sp_executesql
执行的动态查询在当前作用域中不是。您需要在动态查询中调用SCOPE_IDENTITY()
或使用其他方法来获得所需的结果。
以下是您使用SCOPE_IDENTITY()
:
DECLARE @ID int;
EXEC sp_executesql N'
INSERT INTO …;
SET @ID = SCOPE_IDENTITY();
', N'@ID int OUTPUT', @ID OUTPUT;
RETURN @ID;
或者您可以尝试以下方法:
DECLARE @LastID TABLE (ID int);
INSERT INTO @LastID (ID)
EXEC sp_executesql N'
INSERT INTO …;
SELECT SCOPE_IDENTITY();
';
RETURN (SELECT TOP 1 ID FROM @LastID);
如果您使用的是SQL Server 2005+,则可以修改上述方法以使用OUTPUT
的{{1}}子句代替INSERT
。