我有一个只返回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
有什么建议吗?
答案 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)。