Я использую 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
Проблема в том, что @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
Мой синтаксис курсора, вероятно, изобилует ошибками, но вы поняли идею.