2012-06-26 70 views
1

我正在使用execute sp_executesql在sp中執行插入查詢。查詢執行,插入正確發生。之後,我使用scope indentity(),將值設置爲一個輸出段。但我得到錯誤:過程試圖返回NULL的狀態,這是不允許的。將返回狀態0代替

procedure attempted to return a status of NULL, which is not allowed. A status of 0 will be returned instead.

如何解決它?有人有想法嗎?

+2

我們需要確認代碼,但它聽起來像是在嘗試訪問'SCOPE_IDENTITY()'之前的最後一個語句不是插入到具有'IDENTITY'列的表中。 –

+1

輸出參數與返回值不同。 – podiluska

回答

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子句INSERT而不是SELECT SCOPE_IDENTITY()

+0

謝謝安德烈,爲你的幫助。我做了同樣的,但不是變量,我已經採取了輸出參數。但它不工作。我寫了scope_identity()裏面的sp_executesql –