错误时从存储过程返回值

23 sql sql-server stored-procedures return-value

我在SQL Server中有一个sp,当错误返回-4时

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


必须有一些标准

例如

declare @RetVal int  
EXEC @RetVal = stpTest  
select @RetVal
Run Code Online (Sandbox Code Playgroud)

其中stpTest是"SELECT 1/0"返回-6.

-6必须意味着什么!


返回-4的sp只有UPDATE和SELECT INTO语句.

在任何时候它都没有'SELECT -4'所以我怎样才能"找出-4特定存储过程中的含义"?

另外,如果没有标准,为什么除以零错误总是返回-6?


如果你有一个不返回任何内容的sp,即它没有任何select语句,你可以:

declare @RetVal int  
EXEC @RetVal = yourSPName  
Run Code Online (Sandbox Code Playgroud)

然后@RetVal的值为0.

如果有错误,那么@RetVal将是一个除零之外的值,例如,如果sp的唯一作用是"SELECT 1/0",那么@RetVal将为-6.

试试看吧

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

小智 28

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

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

你可能会猜到这不是非常有用,但是:0是成功,其他一切都是错误的.


Joh*_*ers 10

返回代码没有标准.您必须找出特定存储过程中-4的含义.实际上,并非所有返回码都是错误.


编辑:反例

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

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

GO
Run Code Online (Sandbox Code Playgroud)

执行:

DECLARE @return_value int

EXEC    @return_value = [dbo].[RetValTest]

SELECT  'Return Value' = @return_value

GO
Run Code Online (Sandbox Code Playgroud)

结果:

Msg 8134, Level 16, State 1, Procedure RetValTest, Line 9
Divide by zero error encountered.
Run Code Online (Sandbox Code Playgroud)

这是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.


Jim*_* G. 5

例如

declare @RetVal int  
EXEC @RetVal = stpTest  
select @RetVal
Run Code Online (Sandbox Code Playgroud)

哪里stpTestSELECT 1/0返回-6。

-6 一定意味着什么!

如果您有一个不返回任何内容的 sp,即其中没有任何 select 语句并且您执行以下操作:

declare @RetVal int  
EXEC @RetVal = yourSPName  
Run Code Online (Sandbox Code Playgroud)

然后@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%。冲洗并重复。