Процедура или функция «SlctNxtPrv» ожидает параметр «@PRV», который не был предоставлен? - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь построить хранимую процедуру с выходными параметрами. Тем не менее, он просит меня предоставить значение для результатов.

Эта процедура состоит из 3 простых вещей

  1. выбор строки на основе заданного идентификатора
  2. присвоение идентификатора предыдущей строки выходному параметру
  3. присвоить идентификатор следующей строки выходному параметру

SQL Хранимая процедура

ALTER PROCEDURE [dbo].[SlctNxtPrv]   
(
@Art int,   
@PRV int NULL OUTPUT,  
@NXT int NULL OUTPUT  
)  
AS  
BEGIN   
SELECT @PRV = isnull((SELECT TOP 1 id FROM [dbo].[ArtList] where id < @Art ORDER BY id desc),0)  
SELECT @NXT = isnull((SELECT TOP 1 id FROM [dbo].[ArtList] where id > @Art ORDER BY id asc),0)   
SELECT * from [dbo].[ArtList] where [id] = @Art   
END

Я выполняю с этим

exec [dbo].[SlctNxtPrv] @Art = 4 ;

и результат получается следующим образом

Procedure or function 'SlctNxtPrv' expects parameter '@PRV', which was not supplied.

Ответы [ 3 ]

4 голосов
/ 12 марта 2020

Просто потому, что они являются выходными параметрами, они волшебным образом не возникают сами по себе, когда вы вызываете процедуру. Вам по-прежнему необходимо предоставить их на сайте вызовов.

declare @PRV int
declare @NXT int
exec [dbo].[SlctNxtPrv] @Art = 4, @PRV output, @NXT output ;
--Do something with @PRV or @NXT or both.

(причина ошибок номер один IME забывает пометить их как OUTPUT в вызове exec, что означает, что они сохраняют свои исходные значения когда EXEC завершен)

0 голосов
/ 12 марта 2020

Параметры OUTPUT не имеют значения по умолчанию (@OutputParam int NULL OUTPUT означает, что параметры имеют значение NULL, а не значение по умолчанию NULL), поэтому (так же, как параметр "input") a значение должно быть передано в SP.

Это означает, что вам нужно написать что-то вроде:

DECALRE @Art int,   
        @PRV int,  
        @NXT int;
SET @Art = 4;

EXEC dbo.SlctNxtPrv @Art, @PRV OUTPUT, @NXT OUTPUT;

Если, однако, вы хотите, чтобы параметры OUTPUT были необязательными, вы нужно будет дать им значение по умолчанию, используя = NULL. Тогда вам не нужно их поставлять:

ALTER PROCEDURE [dbo].[SlctNxtPrv] @Art int,
                                    @PRV int = NULL OUTPUT,
                                    @NXT int = NULL OUTPUT AS
BEGIN
    SELECT @PRV = ISNULL((SELECT TOP 1 id FROM [dbo].[ArtList] WHERE id < @Art ORDER BY id DESC), 0);
    SELECT @NXT = ISNULL((SELECT TOP 1 id FROM [dbo].[ArtList] WHERE id > @Art ORDER BY id ASC), 0);
    SELECT *
    FROM [dbo].[ArtList]
    WHERE [id] = @Art;
END;
GO

EXEC dbo.SlctNxtPrv @Art = 4;

DB <> Fiddle

0 голосов
/ 12 марта 2020

Просто объявите переменную для вывода и передайте ее хранимой процедуре следующим образом:

declare @previous int 
declare @next int 
exec [dbo].[slctnxtprv] @art = 4, @previous output, @next output
...