从存储过程返回输出参数

时间:2020-05-28 16:32:23

标签: sql-server tsql azure-sql-database

我基于here上的示例创建了一个存储过程。但是,我得到一个错误。我在这里想念什么?

CREATE PROCEDURE SFT.usp_GetPrefix
(@p_table  VARCHAR(30), 
 @p_prefix VARCHAR(3) OUTPUT
)
AS
    BEGIN
        DECLARE @lv_prefix VARCHAR(3);

        SELECT @lv_prefix = SUBSTRING(@p_table, 1, 3);

        IF(@lv_prefix = 'MAC')
            BEGIN
                SET @p_prefix = @lv_prefix;
                RETURN;
            END;
        ELSE
            SET @p_prefix = 'UNK';
            RETURN;
    END;

这是我的执行方式:

EXEC SFT.usp_GetPrefix @p_table = 'MAC_CHEESE';

Msg 201,级别16,状态4,过程SFT.usp_GetPrefix,第0行[批处理 [第6行开始]过程或函数'usp_GetPrefix'需要参数 '@p_prefix',未提供。

也尝试过:

EXEC SFT.usp_GetPrefix @p_table = 'MAC_CHEESE', @p_prefix OUTPUT

Msg 137, Level 15, State 2, Line 6
Must declare the scalar variable "@p_prefix".

1 个答案:

答案 0 :(得分:1)

您需要传递参数,因为它们都不具有默认值。由于@p_prefix是一个OUTPUT参数,为了使用该值,您需要声明一个变量以传递给该参数:

DECLARE @p_prefix varchar(3);
EXEC SFT.usp_GetPrefix @p_table = 'MAC_CHEESE', @p_prefix OUTPUT;

--PRINT @p_prefix; --Or whatever you're going to do with the value.

作为旁注,您可以使您的过程大大缩短:

CREATE PROCEDURE SFT.usp_GetPrefix @p_table  VARCHAR(30), @p_prefix VARCHAR(3) OUTPUT AS
BEGIN

    SET @p_prefix = CASE LEFT(@p_table,3) WHEN 'MAC' THEN 'MAC' ELSE 'UNK' END;

END