簡體   English   中英

錯誤時從存儲過程返回值

[英]Return value from a stored proc on error

我在SQL Server中有一個sp,當錯誤返回-4時

-4是什么意思? 是否有一個表格可以解釋可能的返回值是什么?


必須有一些標准

例如

declare @RetVal int  
EXEC @RetVal = stpTest  
select @RetVal

其中stpTest是“SELECT 1/0”返回-6。

-6必須意味着什么!


返回-4的sp只有UPDATE和SELECT INTO語句。

在任何時候它都沒有'SELECT -4'所以我怎樣才能“找出-4特定存儲過程中的含義”?

另外,如果沒有標准,為什么除以零錯誤總是返回-6?


如果你有一個不返回任何內容的sp,即它沒有任何select語句,你可以:

declare @RetVal int  
EXEC @RetVal = yourSPName  

然后@RetVal的值為0。

如果有錯誤,則@RetVal將是一個除零以外的值,例如,如果您的sp唯一做的是“SELECT 1/0”,那么@RetVal將為-6。

試試看吧

我的問題是這些返回值是什么意思? 他們必須具有一定的邏輯意義!

如果你有一個帶有顯式返回值的RETURN語句,那當然是返回值。

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

你可能會猜到這不是非常有用,但是:0是成功,其他一切都是錯誤的。

返回代碼沒有標准。 您必須找出特定存儲過程中-4的含義。 實際上,並非所有返回碼都是錯誤。


編輯:反例

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[RetValTest] 
AS
BEGIN
    select 1/0;
END

GO

執行:

DECLARE @return_value int

EXEC    @return_value = [dbo].[RetValTest]

SELECT  'Return Value' = @return_value

GO

結果:

Msg 8134, Level 16, State 1, Procedure RetValTest, Line 9
Divide by zero error encountered.

這是SQL Server 2008。


一些研究表明,這種行為可能會遺留在SQL Server 6.0中。 如果是這種情況,那么你可以自己決定它可能是多么可靠,因為它們很久以前就停止了記錄(並且停止保證其准確性)。


我的“研究”應該歸功於SQL Server MVP Tibor Karaszi 他的來源是SQL Server 6.5的聯機叢書。 在“控制流語言”下,“返回”,他找到了

“SQL Server保留0表示成功返回並保留-1到99之間的負值以指示失敗的原因。如果未提供用戶定義的返回值,則使用SQL Server值。用戶定義的返回狀態值不應該與SQL Server保留的那些沖突。目前正在使用值0到-14。

我認為應該編輯這個問題 -

如果您的存儲過程中沒有RETURN語句,那么默認返回值是多少?

我找到的東西來自這個鏈接www.redware.com/handbooks/sql_server_handbook/sql_server_stored_procedures.html

SQL Server將默認返回值為零。 返回值通常用於從存儲過程返回狀態標志,其中非零值通常表示處理期間出現故障。

使用ODBC很難訪問返回值,建議僅在與其他存儲過程通信時返回存儲過程的成功或失敗。

從此鏈接 - sqlserverpedia.com/wiki/Stored_Procedures_-_Output_Parameters_&_Return_Values

返回值-99到0保留給SQL Server內部使用。 您可以創建自己的參數,這些參數可以傳遞回調用程序。

另外一個鏈接(我猜)來自@Erland Sommarskog www.sommarskog.se/error-handling-I.html

從存儲過程返回值

所有存儲過程都有一個返回值,由RETURN語句確定。 RETURN語句采用一個可選參數,該參數應為數值。 如果在沒有提供值的情況下說RETURN,則在執行期間沒有錯誤時返回值為0。 如果在執行過程期間發生錯誤,則返回值可以是0,或者可以是負數。 如果過程中根本沒有RETURN語句,則情況也是如此:返回值可以是負數,也可以是0。

這些負數是否有任何意義,有點難以辨別。 過去是這樣的,返回值-1到-99是為系統生成的返回值保留的,而聯機叢書為早期版本的SQL Server指定了值-1到-14的含義。 但是,適用於SQL 2000的聯機叢書對任何此類預留都保持沉默,並不解釋-1到-14的含義。

有些偶然的例外,Microsoft附帶SQL Server的系統存儲過程返回0表示成功,任何非零值表示失敗。

獲取錯誤信息

此外,如果您需要找到錯誤是什么(而不是-6意味着),您可以嘗試將您的sql放入try catch中,即。

begin try

    select 1/0 as 'an error'

end try

begin catch

    select ERROR_NUMBER() as 'ERROR_NUMBER', 
           ERROR_SEVERITY() as 'ERROR_SEVERITY',
           ERROR_STATE() as 'ERROR_STATE',
           LEFT(ERROR_PROCEDURE(),50) as 'ERROR_PROCEDURE',
           ERROR_LINE() as 'ERROR_LINE' , 
           LEFT(ERROR_MESSAGE(),40) as 'ERROR_MESSAGE'    
end catch 

例如

 declare @RetVal int EXEC @RetVal = stpTest select @RetVal 

其中stpTestSELECT 1/0返回-6。

-6必須意味着什么!

如果你有一個不返回任何內容的sp,即它沒有任何select語句,你可以:

 declare @RetVal int EXEC @RetVal = yourSPName 

然后@RetVal的值為0。

如果有錯誤,那么@RetVal將是一個除零之外的值,例如,如果您的sp唯一做的是SELECT 1/0那么@RetVal將為-6。

試試看吧


首先,感謝您打算制作一個返回-6的示例。

是文檔中關於-6的內容

-6發生其他用戶錯誤。

-6可能是SQL Server返回的最無定形的代碼。
為什么? 因為-6錯誤代碼本質上隱藏了調用堆棧中更深層的錯誤。

在自行解決此錯誤后,以下是解決此錯誤的提示:

  1. 如果您的DAL或應用程序層生成此錯誤,則在SQL Server Management Studio 中以應用程序用戶身份運行SQL代碼而不是使用您自己的SQL Server ID。 [為什么? 因為您的權限可能不一樣。]
  2. 使受檢查的SQL代碼盡可能可讀。 [為什么? 因為這個錯誤可能潛伏在調用堆棧的深處。]
  3. 失敗一切,注釋掉一半的代碼。 錯誤是否仍在發生? 評論50%的剩余代碼。 沖洗並重復。

我不確定是否有辦法在不詢問SQL Server開發人員的情況下知道這一點。 它比您的存儲過程更低級別,評估您發送它並生成返回代碼。 除非你在代碼中特別得到RETURN -4 ,否則它可能來自SQL解析器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM