Параметр Out назначен правильно, но вызывающая сторона видит только NULL. Подсказка?

У меня есть эта процедура, которая удаляется / создается как часть сценария T-SQL - идея состоит в том, чтобы вставить родительскую запись и вывести ее идентификатор вызывающей стороне, чтобы я мог вставить дочерние записи, используя этот идентификатор.

if exists (select * from sys.procedures where name = 'InsertCategory')
    drop procedure dbo.InsertCategory;
go

create procedure dbo.InsertCategory
     @code nvarchar(5)
    ,@englishName nvarchar(50)
    ,@frenchName nvarchar(50)
    ,@timestamp datetime = null
    ,@id int output
as begin

    if @timestamp is null set @timestamp = getdate();

    declare @entity table (_Id int, EntityId uniqueidentifier);
    declare @entityId uniqueidentifier;

    if not exists (select * from dwd.Categories where Code = @code)
    insert into dwd.Categories (_DateInserted, Code, EntityId) 
        output inserted._Id, inserted.EntityId into @entity
        values (@timestamp, @code, newid());
    else
        insert into @entity
        select _Id, EntityId from dwd.Categories where Code = @code;

    set @id = (select _Id from @entity);
    set @entityId = (select EntityId from @entity);

    declare @english int;
    set @english = (select _Id from dbo.Languages where IsoCode = 'en');

    declare @french int;
    set @french = (select _Id from dbo.Languages where IsoCode = 'fr');

    exec dbo.InsertTranslation @entityId, @english, @englishName, @timestamp;
    exec dbo.InsertTranslation @entityId, @french, @frenchName, @timestamp;

end
go

Затем немного дальше по сценарию, он называется так:

declare @ts datetime;
set @ts = getdate();

declare @categoryId int;

exec dbo.InsertCategory 'C1', 'Category1', 'Catégorie1', @ts, @categoryId;
exec dbo.InsertSubCategory 'SC1', @categoryId, 'Description (EN)', 'Description (FR)', @ts

Когда я отлаживаю скрипт и перебираю строку за строкой, я вижу, что dbo.InsertCategory правильно назначает @id параметр out, который сценарий видит как @categoryId - проблема в том, что @categoryId всегда nullи поэтому я ничего не вставляю в dwd.SubCategories,

Что я делаю неправильно?

1 ответ

Решение

Вы должны упомянуть @categoryId параметр как OUTPUT при вызове процедуры иначе она не будет возвращать значение. Вызовите процедуру, как это

exec dbo.InsertCategory 'C1', 'Category1', 'Catégorie1', @ts, @categoryId OUTPUT;

пример

CREATE PROCEDURE Procd (@a INT, @b INT output)
AS
  BEGIN
      SELECT @b = @a
  END

DECLARE @new INT

EXEC Procd 1,@new 
SELECT @new -- NULL

EXEC Procd 1,@new OUTPUT 
SELECT @new -- 1
Другие вопросы по тегам