У меня есть ситуация, подобная этой SO question, где я хочу скопировать родительские строки и их дочерние строки из и в одну и ту же таблицу.Скопировать родительские и дочерние строки в одну таблицу?
Предлагаемый ответ с использованием OUTPUT
и MERGE
является чистым, но учитывает только одну запись.
Есть ли способ изменить его для обработки нескольких родительских строк?
EDIT
Я попытался изменить оператор SQL и пришел с этим:
DECLARE @fromId int, @toId int;
SET @fromId = 1;
SET @toId = 2;
DECLARE @mapping TABLE (old_id int, new_id int);
INSERT INTO parent_table (col1, col2, col3)
SELECT @toId, col2, col3
FROM parent_table
WHERE col1 = @fromId;
MERGE child_table tgt
USING (
SELECT t.parent_id, t.col2, t.col3
FROM child_table t
inner join parent_table p on p.id = t.parent_id
WHERE p.col1 = @toId
) src
ON 0 = 1
WHEN NOT MATCHED THEN
INSERT (parent_id, col2, col3) VALUES (src.parent_id, src.col2, src.col3)
OUTPUT src.parent_id, INSERTED.parent_id INTO @mapping (old_id, new_id);
Первый INSERT
родительских строк работает. Однако вторая вставка вставляет любые дочерние строки. Что мне не хватает?
Share некоторые образцы записей. Надежные значения с parent_id 2 присутствуют в дочерней таблице. –