Параметр 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