Возвращение выходного параметра из хранимой процедуры - PullRequest
0 голосов
/ 28 мая 2020

Я создал хранимую процедуру на основе примера из здесь на SO. Однако я получаю сообщение об ошибке. Что мне здесь не хватает?

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 [Batch Start Line 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 Ответ

1 голос
/ 28 мая 2020

Вам необходимо передать параметры, поскольку ни один из них не имеет значений по умолчанию. Поскольку @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
...