sql 服务器 - 在存储过程中使用 varchar 输出参数是什么 - 不能'return @myvarchar'但可以'select @myvarchar'



示例:

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输出变量。

输出变量与返回值不同。返回值始终是一个整数。你可以像这样检索:

exec @retval = dbo.MyStoredProcedure

当检索输出参数时,如:

exec dbo.MyStoredProcedure @par_out output

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

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

您混淆了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

您可以使用设置

declare
 @variable_name datatype
begin
 set @variable_name= (select query)
end

不要使用return语句返回varchar

最新更新