我在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。
试试看
我的问题是这些返回值是什么意思?他们必须具有一定的逻辑意义!
答案 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
其中
stpTest
为SELECT 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错误代码本质上隐藏了调用堆栈中更深层的错误。
自行解决此错误后,以下是解决此错误的提示:
答案 4 :(得分:-1)
我不确定在没有询问SQL Server开发人员的情况下有办法知道这一点。它比您的存储过程更低级别,评估您发送它并生成返回代码。除非你在代码中特意得到 RETURN -4 ,否则它可能来自SQL解析器。