3

示例:

CREATE PROCEDURE dbo.sp_Delete (@p1 INT, @p2 VARCHAR(10) OUTPUT)
AS
    --@p1 will have calculations done and get a value for @p2
    SET @p2 = 'test'
    RETURN @p2

测试:

DECLARE @p2 VARCHAR(100)
EXEC sp_Delete
     @p1 = N'1',
     @p2 = N''

错误:

Conversion failed when converting the varchar value 'test' to data type int.

但是你可以这样做:

ALTER PROCEDURE dbo.sp_Delete (@p1 INT)
AS
    --@p1 will have calculations done and get a value for @p2
    SELECT 'test'


    EXEC sp_Delete
         @p1 = N'1'

所以我的问题是,当你不能使用“return @myvar”如果它是一个 varchar 时,拥有一个 varchar 类型的 OUTPUT 参数有什么用(注意我不是在质疑一个 int 类型的输出参数)。您可以只“选择@myvar”。我试图弄清楚我做错了什么,因为我认为我不了解特定 varchar 输出变量的使用。

4

3 回答 3

4

输出变量不同于返回值。返回值始终是整数。您可以像这样检索它:

exec @retval = dbo.MyStoredProcedure

检索输出参数时,如下所示:

exec dbo.MyStoredProcedure @par_out output

在您的情况下,请省略该return语句。 set @par_out = 'value'足以将输出参数返回给调用代码。

于 2013-02-13T09:52:32.480 回答
4

RETURN只能返回int值。实际上,您不需要使用RETURN,只需省略它:

 create PROCEDURE dbo.sp_Delete (
@p1 int,
@p2 varchar(10) OUTPUT
)
AS
--@p1 will have calculations done and get a value for @p2
set @p2 = 'test'

...

declare @p1 int, @p2 varchar(100)
SELECT @p2 = '', @p1 = 1
exec sp_Delete
@p1,
@p2 OUTPUT

select @p2
于 2013-02-13T09:52:56.513 回答
3

您混淆了 RETURN 值和 OUTPUT 参数这两件事。

RETURN 是 sp 执行的“整体”状态,而 OUTPUT 参数允许您发回在您的过程中计算的多个值。

此外,要让 OUTPUT 参数发回它们的值,您应该指定 OUTPUT 关键字

declare @p2 varchar(100)
exec sp_Delete
@p1=N'1',
@p2=@p2 OUTPUT -- first @p2 is then sp_parameter name, second is the @p2 variable from you outer batch

select @p2

您可以将 RETURN 值与 OUTPUT 参数混合

CREATE PROCEDURE TestProc
@P1 INT, 
@P2 VARCHAR(10) OUTPUT
AS
BEGIN
   SET @P2='SOME VALUE'
   RETURN @P1
END
GO
DECLARE @R INT, @P VARCHAR(10)
EXEC @R=TestProc @P1=1, @P2=@P OUT --OUT is short for OUTPUT, you can use either one
SELECT @R, @P

-----------------
1, 'SOME VALUE'

不使用 OUTPUT 关键字,您将拥有

DECLARE @R INT, @P VARCHAR(10)
EXEC @R=TestProc @P1=1, @P2=@P -- notice the missing OUTPUT
SELECT @R, @P --was not assigned in this batch so is NULL

-----------------
1, NULL
于 2013-02-13T10:08:19.337 回答