EXEC sp_executesql - захватывает значение RETURN и значение OUTPUT из вызова хранимой процедуры - PullRequest
2 голосов
/ 15 марта 2019

Учитывая простую хранимую процедуру, которая заполняет параметр OUTPUT, а также RETURN s значение, например:

CREATE PROCEDURE sp_test 
(
    @param_out INT OUTPUT
)
AS BEGIN
    SELECT @param_out = 9
    RETURN 2
END

Как я могу вызвать эту процедуру, используя sp_executesql и захватить оба эти значения?

Я пробовал:

DECLARE @ret INT, @param_out INT
EXEC SP_EXECUTESQL N'EXEC @ret = sp_test',
    N'@ret INT OUTPUT, @param_out INT OUTPUT',
    @ret OUTPUT,
    @param_out OUTPUT

SELECT @ret, @param_out

Однако это жалуется, что @param_out не был предоставлен:

Процедура или функция sp_test ожидает параметр '@param_out', который не был предоставлен.

Ответы [ 2 ]

5 голосов
/ 15 марта 2019

Вам также необходимо передать оба значения как OUTPUT параметры sp_executesql:

DECLARE @ret int,
        @param_out int;
EXEC sp_executesql N'EXEC @ret = sp_test @param_out OUT;',
                   N'@ret INT OUTPUT, @param_out INT OUTPUT',
                   @ret OUTPUT,
                   @param_out OUTPUT;

SELECT @ret,
       @param_out;

Я должен спросить, почему вы хотите это сделать?В этом SQL нет ничего динамического, так почему вы используете sp_executesql?Я также не советую использовать возвращаемое значение SP;Вы действительно должны использовать другой параметр OUTPUT.

0 голосов
/ 15 марта 2019

Вам не нужно sp_executesql здесь только потому, что имя хранимой процедуры является динамическим.

EXEC грамматика принимает @module_name_var.

Вы можете сделать

DECLARE @ret       INT,
        @param_out INT
DECLARE @procname SYSNAME = 'sp_test'

EXEC @ret = @procname
  @param_out OUTPUT 

и будет выполнена процедура с именем в @procname

...