错误时从存储过程返回值

时间:2009-06-23 23:30:21

标签: sql sql-server stored-procedures return-value

我在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。

试试看

我的问题是这些返回值是什么意思?他们必须具有一定的逻辑意义!

5 个答案:

答案 0 :(得分:28)

如果你有一个带有显式返回值的RETURN语句,那当然是返回值。

但是如果没有RETURN语句,但在执行期间发生错误,则返回值为10减去错误的严重性级别。除以零是16级,因此返回值为-6。权限错误是典型的14级,因此返回值为-4。

正如你可能猜到的那样,这不是非常有用,但是:0是成功,其他一切都是错误。

答案 1 :(得分:10)

返回代码没有标准。您必须找出特定存储过程中-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的联机丛书。在“Control-Of-Flow Language”下,“返回”,他找到了

“SQL Server保留0表示成功返回并且 保留负值 - 从1到-99表示 不同的失败原因。如果没有用户定义的返回值 提供,使用SQL Server值。用户定义的返回状态 值不应与SQL Server保留的值冲突。该 值0到-14当前正在使用中。

答案 2 :(得分:3)

我认为应该编辑问题 -

  

如果是,默认返回值是多少   你没有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,也可以是a   负数。如果是这样的话也是如此   根本没有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 

答案 3 :(得分:3)

  

例如

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

其中stpTestSELECT 1/0,返回-6。

     

-6必须意味着什么!

     

如果你的sp没有返回任何东西,即它没有   其中包含任何选择语句:

declare @RetVal int  
EXEC @RetVal = yourSPName  
     

然后@RetVal的值为0.

     

如果出现错误,则@RetVal将是除零以外的值,   例如,如果您的sp做的唯一事情是SELECT 1/0那么   @RetVal将为-6。

     

试试看


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

这是what the documentation says about -6

  

-6发生了其他用户错误。

-6可能是SQL Server返回的最无定形的代码 为什么?因为-6错误代码本质上隐藏了调用堆栈中更深层的错误。

自行解决此错误后,以下是解决此错误的提示:

  1. 如果您的DAL或应用程序层生成此错误,则在SQL Server Management Studio中运行SQL代码作为应用程序用户,使用您自己的SQL Server ID。 [为什么?因为您的权限可能不一样。]
  2. 使受检查的SQL代码尽可能可读。 [为什么?因为此错误可能潜伏在调用堆栈内。]
  3. 失败一切,注释掉一半的代码。错误是否仍在发生?评论50%的剩余代码。冲洗并重复。

答案 4 :(得分:-1)

我不确定在没有询问SQL Server开发人员的情况下有办法知道这一点。它比您的存储过程更低级别,评估您发送它并生成返回代码。除非你在代码中特意得到 RETURN -4 ,否则它可能来自SQL解析器。