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.
例如
Run Code Online (Sandbox Code Playgroud)declare @RetVal int EXEC @RetVal = stpTest select @RetVal
哪里
stpTest
是SELECT 1/0
返回-6。-6 一定意味着什么!
如果您有一个不返回任何内容的 sp,即其中没有任何 select 语句并且您执行以下操作:
Run Code Online (Sandbox Code Playgroud)declare @RetVal int EXEC @RetVal = yourSPName
然后
@RetVal
将有一个值为 0。如果有错误,那么
@RetVal
将是例如其他然后零值,如果你的SP做的唯一事情就是SELECT 1/0
那么@RetVal
将是-6。试试看
首先,感谢您费心制作一个返回 -6 的示例。
-6 发生其他用户错误。
-6 可能是 SQL Server 返回的最无定形的代码。
为什么?因为 -6 错误代码本质上是在调用堆栈中更深地隐藏了一个错误。
在自己解决此错误后,以下是我解决此错误的提示: