我有一个由另一个存储过程调用的存储过程
ALTER PROCEDURE [dbo].[usp_Test]
AS
begin
declare @errorCode int
declare @lastIdentity int
select @errorCode = @@ERROR
if @errorCode=0
begin
update Vehicle set model='1996----------'
where Make='MERC'
select @errorCode = @@ERROR
select @lastIdentity = @@IDENTITY
end
print 'usp_test lastIdentity=' + convert(varchar(10), isnull(@lastIdentity,0))
print 'usp_test errorCode=' + convert(varchar(10), @errorCode)
end
如果我像这样调用存储过程
declare @RetVal int
exec @RetVal=usp_Test
print 'return value is ' + convert(varchar(10), @RetVal)
我收到以下消息
Msg 8152,Level 16,State 14,Procedure usp_Test,Line 14 字符串或二进制数据将被截断。 该语句已终止。 usp_test lastIdentity = 0 usp_test errorCode = 8152 返回值为-6
通过在结尾处添加RETURN 0并在select @errorCode之后添加RETURN @errorCode ...我将有一个很好的清除方式来返回错误并随后处理它。我很惊讶,如果没有任何RETURN,我会得到-6的返回值。任何人都可以解释为什么会这样吗?
答案 0 :(得分:5)
如果你有一个带有的RETURN语句 显式返回值,即 当然是回报值。
但是如果没有RETURN语句, 但执行过程中出错 返回值是10减去 错误的严重性级别。师 零是16级,因此返回 值是-6。权限错误是 典型的14级,因此返回 值是-4。
正如你可能猜到的那样,这并不是非常糟糕 有用,但是:0是成功的,而且 其他一切都是错误的。
答案 1 :(得分:0)
未指定任何内容且正确执行的过程的标准返回值为1.
当过程返回错误并且您没有指定返回值时,返回的默认值为10 - errorlevel,最大值为0.
例如:
CREATE PROCEDURE p_error16
AS
RAISERROR('error', 16, 1)
GO
将返回-6,其中以下proc将返回-7:
CREATE PROCEDURE p_error17
AS
RAISERROR('error', 17, 1)
GO
如果errorlevel低于10,则返回的值为0:
CREATE PROCEDURE p_error5
AS
RAISERROR('error', 5, 1)
GO
答案 2 :(得分:0)
以下链接包含我正在寻找的答案: http://www.sommarskog.se/error-handling-I.html#returnvalue
这是一个摘录。 “所有存储过程都有一个由RETURN语句确定的返回值.RETURN语句带有一个可选参数,该参数应该是一个数值。如果你说RETURN没有提供值,如果没有错误,则返回值为0如果在执行过程期间发生错误,则返回值可能为0,或者可能为负数。如果过程中根本没有RETURN语句,则同样如此:返回值可能为负数数字或它可能是0.“