应该没有转换时存储过程返回转换错误

时间:2015-04-08 19:26:19

标签: sql sql-server tsql

我有一个只返回varchar(1000)的存储过程,但是当我使用以下块运行时:

declare @P1 VARCHAR(1000) 
SET @P1='' 
PRINT 'P1='+@P1
exec Test @PhoneNumber='1234567890',@AgentID=N'Test AgentID',@SP_RETURN=@P1 output  
PRINT 'P1='+@P1

我得到了

  

Msg 50000,Level 16,State 1,Procedure Test,Line 50
  将varchar值'Complete'转换为数据类型int ..

时转换失败      

Msg 245,Level 16,State 1,Procedure Test,Line 60
  将varchar值'Exception raise'转换为数据类型int。

时转换失败

这是存储过程:

Create PROCEDURE [dbo].[Test]  
    @PhoneNumber as CHAR(10),  
    @AgentID as VARCHAR(100),  
    @SP_RETURN as VARCHAR(1000) OUTPUT,  
    @UTCDateTimeOverride as Datetime = NULL  
AS  
BEGIN  
 BEGIN TRY  
  SET @SP_RETURN = N'Complete'
  RETURN @SP_RETURN  
 END TRY  

 BEGIN CATCH  
  SET @SP_RETURN = N'Exception raised'
  RETURN @SP_RETURN  
 END CATCH  
END  
go

有什么建议吗?

4 个答案:

答案 0 :(得分:5)

stored procedure总是返回整数,用于返回错误代码

您将返回导致异常的varchar字段

错误是由此

引起的
RETURN @SP_RETURN

改为执行此操作

  BEGIN TRY  
  SET @SP_RETURN = N'Complete'
  RETURN 0  -- success
  END TRY  

  BEGIN CATCH  
  SET @SP_RETURN = N'Exception raised'
  RETURN  ERROR_NUMBER()  -- error code

答案 1 :(得分:1)

存储过程只能返回Int值。 Varchar值被"返回"通过OUTPUT变量。

Create PROCEDURE [dbo].[Test]  
 @PhoneNumber as CHAR(10),  
 @AgentID as VARCHAR(100),  
 @SP_RETURN as VARCHAR(1000) OUTPUT,  
 @UTCDateTimeOverride as Datetime = NULL  
AS  
BEGIN  
 BEGIN TRY  
  SET @SP_RETURN = N'Complete'
  --RETURN @SP_RETURN  not needed
 END TRY  

 BEGIN CATCH  
  SET @SP_RETURN = N'Exception raised'
  -- no need for return statement here 
 END CATCH  
END  
go

现在执行proc时你会做类似......

的事情
DECLARE @RETURN_Value VARCHAR(1000);

Exec [dbo].[Test]   @PhoneNumber = 'Some Value'  
                   ,@AgentID     = 'Some Value'
                   ,@SP_RETURN   = @RETURN_Value OUTPUT

现在@RETURN_Value变量的值为

答案 2 :(得分:0)

您已经将@SP_RETURN指定为OUTPUT。你也不需要在RETURN语句中使用它。只是"返回"

答案 3 :(得分:0)

优良作法是在存储过程中使用return只是为了提供反馈,程序是否成功执行。要返回值,最好使用输出参数。

使用输出参数,您可以: 1.返回超过1个值(使用return,你只能返回一个值); 2.返回任何数据类型(使用return关键字,只能返回int)。