У меня есть родительская таблица, которая представляет собой документ-сортировки, причем каждая запись в таблице содержит n записей детей в дочерней таблице. Каждая дочерняя запись может иметь n записей внуков. Эти записи находятся в опубликованном состоянии. Когда пользователь хочет изменить опубликованный документ, нам нужно клонировать родителя и всех его детей и внуков.
Структура таблицы выглядит следующим образом:
Родитель
CREATE TABLE [ql].[Quantlist] (
[QuantlistId] INT IDENTITY (1, 1) NOT NULL,
[StateId] INT NOT NULL,
[Title] VARCHAR (500) NOT NULL,
CONSTRAINT [PK_Quantlist] PRIMARY KEY CLUSTERED ([QuantlistId] ASC),
CONSTRAINT [FK_Quantlist_State] FOREIGN KEY ([StateId]) REFERENCES [ql].[State] ([StateId])
);
Ребенок
CREATE TABLE [ql].[QuantlistAttribute]
(
[QuantlistAttributeId] INT IDENTITY (1, 1),
[QuantlistId] INT NOT NULL,
[Narrative] VARCHAR (500) NOT NULL,
CONSTRAINT [PK_QuantlistAttribute] PRIMARY KEY ([QuantlistAttributeId]),
CONSTRAINT [FK_QuantlistAttribute_QuantlistId] FOREIGN KEY ([QuantlistId]) REFERENCES [ql].[Quantlist]([QuantlistId]),
)
Внук
CREATE TABLE [ql].[AttributeReference]
(
[AttributeReferenceId] INT IDENTITY (1, 1),
[QuantlistAttributeId] INT NOT NULL,
[Reference] VARCHAR (250) NOT NULL,
CONSTRAINT [PK_QuantlistReference] PRIMARY KEY ([AttributeReferenceId]),
CONSTRAINT [FK_QuantlistReference_QuantlistAttribute] FOREIGN KEY ([QuantlistAttributeId]) REFERENCES [ql].[QuantlistAttribute]([QuantlistAttributeId]),
)
В моей хранимой процедуре я передаю QuantlistId
, я хочу клонировать как @QuantlistId
. Поскольку таблица QuantlistAttribute
имеет ForeignKey
, я тоже могу легко клонировать ее.
INSERT INTO [ql].[Quantlist] (
[StateId],
[Title],
) SELECT
1,
Title,
FROM [ql].[Quantlist]
WHERE QuantlistId = @QuantlistId
SET @ClonedId = SCOPE_IDENTITY()
INSERT INTO ql.QuantlistAttribute(
QuantlistId
,Narrative)
SELECT
@ClonedId,
Narrative,
FROM ql.QuantlistAttribute
WHERE QuantlistId = @QuantlistId
Проблема сводится к AttributeReference
. Если я клонировал 30 QuantlistAttribute
записей, как мне клонировать записи в справочной таблице и сопоставлять их с новыми записями, которые я только что вставил в таблицу QuantlistAttribute
?
INSERT INTO ql.AttributeReference(
QuantlistAttributeId,
Reference,)
SELECT
QuantlistAttributeId,
Reference,
FROM ql.QuantlistReference
WHERE ??? I don't have a key to go off of for this.
Я думал, что смогу сделать это с помощью некоторых временных таблиц ссылок, содержащих старый идентификатор атрибута вместе с новым идентификатором атрибута. Я не знаю, как нужно вставлять старый идентификатор атрибута в временную таблицу вместе со своими новыми. Вставка существующих атрибутов по QuantlistId достаточно проста, но я не могу понять, как правильно связать правильный новый и старый идентификатор, так что таблица AttributeReference
может быть клонирована правильно. Если бы я мог связать новый и старый идентификатор QuantlistAttribute
, я мог бы присоединиться к этой временной таблице и выяснить, как восстановить связь недавно клонированных ссылок, с новыми клонированными атрибутами.
Любая помощь по этому поводу была бы потрясающей. Последние полтора дня я пытался выяснить это без везения:/
Прошу извинить некоторые несоответствия SQL. Я перезаписал sql real быстро, обрезая множество дополнительных столбцов, связанных таблиц и ограничений, которые не были нужны для этого вопроса.
Изменить
После небольшого копания, я обнаружил, что для этого может быть полезен OUTPUT. Есть ли способ использовать OUTPUT для отображения записей QuantlistAttributeId
, которые я только что вставил, в QuantlistAttributeId
они возникли из?