TSQL - 当sp不包含return时从sp返回值

时间:2011-02-18 09:43:23

标签: sql tsql

我有一个由另一个存储过程调用的存储过程

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的返回值。任何人都可以解释为什么会这样吗?

3 个答案:

答案 0 :(得分:5)

this answer

复制
  

如果你有一个带有的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.“