Пожалуйста, будьте терпеливы, пока я объясняю свой сценарий.У меня есть следующие две таблицы:
Items(id, plan, free)
- 'id' - это столбец идентификаторов.
ItemsIncludes(MasterId, IncludeId)
Существует два типа предметов - купленные и бесплатные (включены).Независимо от этого, оба типа элементов хранятся в таблице элементов (очевидно, битовое поле «свободный» устанавливается в соответствии с типом).Таблица ItemsIncludes устанавливает отношение «один ко многим» между купленным предметом (MasterId) и предметами, включенными в него бесплатно (IncludeId).
Шаг 1 - вставить купленные предметы из корзины (без проблем).
Шаг 2 - вставить бесплатные предметы для каждого приобретенного предмета, вставленного на основе плана приобретенного предмета (который не имеет ничего общего с проблемой).
Шаг 3 - вставить идентификаторы, созданные во времяэто первые 2 шага в их правильном отношении к таблице ItemsIncludes (проблема).
Требуется захватить бесплатный itemId, сгенерированный во время вставки, вместе с его приобретенным itemId.Выходное предложение сделало бы это, если бы следующее было допустимо:
Шаг 2 -
Declare @ItemsIncludesIntermediate table(MasterId int, IncludeId int)
Insert into Items
(PlanId, IsFree)
Output it.ID -- Illegal
, inserted.ID into @ItemsIncludesIntermediate
Select pli.IncludePlanId, 1
From Items it
Join PlansIncludes pli on it.PlanId = pli.MasterPlanId
Структура плана также аналогична, но не относится к рассматриваемой проблеме, поэтому не описана.
SQL Server не позволяет ссылаться на что-либо, кроме вставленных столбцов, в условии вывода во время вставки;однако, это не то же самое в случае обновлений / удалений, в которых допустимы операторы, ссылающиеся на любой идентификатор, участвующий в списке FROM.EG:
Примечание: я не запускал следующий пример, но он допустим.
Delete Items
Output iti.MasterID, deleted.ID into @ItemsIncludesIntermediate
From items it
Join ItemsIncludes iti on it.ID = iti.IncludeId
Короче говоря, если я не могу сделать это с помощью предложения output, то как мне получитьбесплатный itemId, как он генерируется вместе с купленным itemId, для которого он генерируется?
Я открыт для просмотра и вместо триггерного подхода, если это возможно.Принципиальная вещь в том, что я не хочу менять структуру.Например, я не хочу удалять таблицу ItemsIncludes и включить MasterItemId в таблицу Items.
Сначала проблема выглядела просто, но теперь действует мне на нервы