[英]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
其中
stpTest
是SELECT 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錯誤代碼本質上隱藏了調用堆棧中更深層的錯誤。
在自行解決此錯誤后,以下是解決此錯誤的提示:
我不確定是否有辦法在不詢問SQL Server開發人員的情況下知道這一點。 它比您的存儲過程更低級別,評估您發送它並生成返回代碼。 除非你在代碼中特別得到RETURN -4 ,否則它可能來自SQL解析器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.