2011-02-18 48 views
0

我有由其他存储过程调用的存储过程TSQL - 从SP返回值当SP不包含返回

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) 

我的存储过程得到以下消息

消息8152,级别16,状态14,过程usp_Test,第14行 字符串或二进制数据将被截断。 该声明已被终止。 usp_test lastIdentity = 0 usp_test错误码= 8152 返回值为-6

通过添加在选择@errorCode后结束,返回@errorCode返回0 ......我会返回错误的一个很好的清洁方法并随后处理它。我很惊讶,没有任何返回,我得到-6的返回值。任何人都可以解释为什么这是事实吗?

+1

不使用@@ IDENTITY:use scope_identity()。99.999超时100%你想要scope_identity()。 – 2011-02-18 09:47:09

+0

是的我同意,我正在开发一个项目,其中的代码是由其他人编写的。但是,这与我询问的问题并不真正相关 – Andrew 2011-02-18 09:50:54

+1

SQL Server存储过程返回代码奇怪](http://stackoverflow.com/questions/2965211/sql-server-stored-procedure-return-code-oddity)。哪些链接http://www.sommarskog.se/error-handling-I.html #returnvalue – gbn 2011-02-18 09:51:04

回答

4

this answer

复制如果你有一个 明确的返回值的RETURN语句,即 当然返回值。

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

正如你所猜测的,这不是非常有用的 ,但是这个:0是成功的,而 其他所有的都是错误的。

0

当你没有指定任何东西,正确执行的程序是1

当程序返回一个错误,你没有指定一个返回值默认返回的标准返回值是10 - 错误级别最多例如为0

值:

CREATE PROCEDURE p_error16 
    AS 
    RAISERROR('error', 16, 1) 
    GO 

将返回-6其中以下PROC将返回-7:

CREATE PROCEDURE p_error17 
    AS 
    RAISERROR('error', 17, 1) 
    GO 

如果错误级别进入下10返回的值是0:

CREATE PROCEDURE p_error5 
    AS 
    RAISERROR('error', 5, 1) 
    GO 
0

以下链接包含我一直在寻找的答案: ​​

这是一种提取物。 “所有的存储过程都有一个返回值,由RETURN语句决定,RETURN语句带有一个可选的参数,它应该是一个数值,如果你说RETURN而不提供一个值,那么如果没有错误,返回值为0在执行期间。如果在执行该过程期间发生错误,则返回值可能为0,也可能为负数。如果在过程中根本没有RETURN语句,则情况也是如此:返回值可能是负数或可能为0.“