ВСТАВЬТЕ данные из одной таблицы в несколько таблиц

Я использую SQL Server 2005.

Я перемещаю данные из текущей базы данных (единственная таблица) к новой базе данных (нормализованный - много таблиц). В новой базе данных у меня есть базовая таблица (давайте назовем ее "Базовой таблицей"), и несколько других таблиц (давайте назовем их "DependentA", и "DependentB"). Некоторые данные из старой базы данных перейдут к BaseTable, и некоторые перейдут к другим двум. BaseTable имеет непосредственные отношения и с DependentA и с DependentB, с помощью идентификатора их в качестве внешнего ключа.

Таким образом, вот мой вопрос. Как я должен переместить данные? Вот запрос, который я пробовал, который работает за исключением одной вещи: внешние ключи в BaseTable для других двух идентичны, вместо этого или наличие другого каждый.

Begin SQL:

BEGIN TRANSACTION

DECLARE @dep1Id int

DECLARE @dep2Id int

INSERT INTO DependentA (column1, column2)
SELECT c1, c2
FROM OldDatabase.OldTable
SELECT @dep1Id = Scope_Identity()

INSERT INTO DependentB (column3, column4)
SELECT c3, c4
FROM OldDatabase.OldTable
SELECT @dep2Id = Scope_Identity()

INSERT INTO BaseTable (column5, dependentTable1Id, dependentTablr2Id)
SELECT c5, @dep1Id, @dep2Id
FROM OldDatabase.OldTable

COMMIT
5
задан Dorababu Meka 20 September 2011 в 05:40
поделиться

1 ответ

Проблема в том, что @dep1Id и @dep1Id являются скалярными и сохраняют только последнее значение из двух вставок на основе набора.

Поскольку это одноразовая вставка, то, вероятно, ее следует выполнять в виде курсора

DECLARE CURSOR @curs FOR
SELECT c1,c2,c3,c4,c5 FROM OldDatebase

open @curs
fetch next from @curs into
@c1,@c2,@c3,@c4,@c5 --declare these!

while @@fetch_status <> 0
BEGIN

INSERT INTO DependentA (column1, column2) VALUES @c1, @c2

SELECT @dep1Id = Scope_Identity()

INSERT INTO DependentB (column3, column4) VALUES @c3, @c4 

SELECT @dep2Id = Scope_Identity()

INSERT INTO BaseTable (column5, department1Id, department2Id) @c5, @dep1Id, @dep2Id    

fetch next from @curs into
@c1,@c2,@c3,@c4,@c5
END
close @curs
deallocate @curs

Мой синтаксис курсора, вероятно, изобилует ошибками, но вы поняли идею.

7
ответ дан 13 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: