2011-02-18 47 views
0

我有由其他存儲過程調用的存儲過程TSQL - 從SP返回值當SP不包含返回

ALTER PROCEDURE [dbo].[usp_Test] 
AS 
begin 
declare @errorCode int 
declare @lastIdentity int 
select @errorCode = @@ERROR 
    if @errorCode=0 
    begin 
     update Vehicle set model='1996----------' 
      where Make='MERC' 
     select @errorCode = @@ERROR 
     select @lastIdentity = @@IDENTITY 
    end 

print 'usp_test lastIdentity=' + convert(varchar(10), isnull(@lastIdentity,0)) 
print 'usp_test errorCode=' + convert(varchar(10), @errorCode) 

end 

如果我這樣調用

declare @RetVal int 

exec @RetVal=usp_Test 

print 'return value is ' + convert(varchar(10), @RetVal) 

我的存儲過程得到以下消息

消息8152,級別16,狀態14,過程usp_Test,第14行 字符串或二進制數據將被截斷。 該聲明已被終止。 usp_test lastIdentity = 0 usp_test錯誤碼= 8152 返回值爲-6

通過添加在選擇@errorCode後結束,返回@errorCode返回0 ......我會返回錯誤的一個很好的清潔方法並隨後處理它。我很驚訝,沒有任何返回,我得到-6的返回值。任何人都可以解釋爲什麼這是事實嗎?

+1

不使用@@ IDENTITY:use scope_identity()。99.999超時100%你想要scope_identity()。 – 2011-02-18 09:47:09

+0

是的我同意,我正在開發一個項目,其中的代碼是由其他人編寫的。但是,這與我詢問的問題並不真正相關 – Andrew 2011-02-18 09:50:54

+1

SQL Server存儲過程返回代碼奇怪](http://stackoverflow.com/questions/2965211/sql-server-stored-procedure-return-code-oddity)。哪些鏈接http://www.sommarskog.se/error-handling-I.html #returnvalue – gbn 2011-02-18 09:51:04

回答

4

this answer

複製如果你有一個 明確的返回值的RETURN語句,即 當然返回值。

但是,如果沒有RETURN語句, 但在執行期間發生錯誤,則返回值爲10減去 嚴重級別的錯誤。 等於零是16級,因此返回 的值爲-6。權限錯誤是 的典型級別14,因此返回 的值爲-4。

正如你所猜測的,這不是非常有用的 ,但是這個:0是成功的,而 其他所有的都是錯誤的。

0

當你沒有指定任何東西,正確執行的程序是1

當程序返回一個錯誤,你沒有指定一個返回值默認返回的標準返回值是10 - 錯誤級別最多例如爲0

值:

CREATE PROCEDURE p_error16 
    AS 
    RAISERROR('error', 16, 1) 
    GO 

將返回-6其中以下PROC將返回-7:

CREATE PROCEDURE p_error17 
    AS 
    RAISERROR('error', 17, 1) 
    GO 

如果錯誤級別進入下10返回的值是0:

CREATE PROCEDURE p_error5 
    AS 
    RAISERROR('error', 5, 1) 
    GO 
0

以下鏈接包含我一直在尋找的答案: ​​

這是一種提取物。 「所有的存儲過程都有一個返回值,由RETURN語句決定,RETURN語句帶有一個可選的參數,它應該是一個數值,如果你說RETURN而不提供一個值,那麼如果沒有錯誤,返回值爲0在執行期間。如果在執行該過程期間發生錯誤,則返回值可能爲0,也可能爲負數。如果在過程中根本沒有RETURN語句,則情況也是如此:返回值可能是負數或可能爲0.「