Вставить данные из одной таблицы в несколько таблиц - PullRequest
5 голосов
/ 11 февраля 2010

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

Я перенес данные из текущей базы данных (одной таблицы) в новую базу данных (нормализовано - много таблиц). В новой базе данных у меня есть базовая таблица (назовем ее «BaseTable») и несколько других таблиц (назовем их "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

Ответы [ 3 ]

7 голосов
/ 11 февраля 2010

Проблема в том, что @ 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

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

4 голосов
/ 15 марта 2012

Чтобы избежать курсора для больших наборов данных, временно включите OldTable_id в новые таблицы.

BEGIN TRANSACTION

INSERT INTO DependentA (OldTable_id, column1, column2)
SELECT ot.id, ot.c1, ot.c2
FROM OldDatabase.OldTable ot

INSERT INTO BaseTable (OldTable_id, column5)
SELECT ot.id, ot.c5
FROM OldDatabase.OldTable ot

UPDATE BaseTable 
    SET BaseTable.dependentTable1_id = DependentA.id
    FROM BaseTable
    INNER JOIN DependentA on DependentA.OldTable_id = BaseTable.OldTable_id

COMMIT

Сделайте то же самое для таблицы DependentB и любых других таблиц, нормализованных из OldTable.

Удалить OldTable_id после переноса данных.

1 голос
/ 24 октября 2017

[введите описание изображения здесь] [1] ZeorOne - это основная таблица, из которой вы хотите получить данные и вставить их в ноль и одну таблицу соответственно.

select idzero,namezero,idone,nameone from zeroone

insert into zero 
select idzero,namezero from zeroone

insert into one
select idone,nameone from zeroone

или вы хотите использовать курсор для вставки данных с выбранными столбцами из Zeroone в две таблицы запрос здесь

Declare @idzero int
Declare @namezero varchar(50)
Declare @idone int
Declare @nameone varchar(50)

Declare Cur Cursor  for
select idzero,namezero,idone,nameone from zeroone

open Cur

fetch Cur into @idzero,@namezero,@idone,@nameone

While @@fetch_status = 0
begin 

    insert into zero 
    select @idzero,@namezero 

    insert into one
    select @idone,@nameone 

    fetch Cur into @idzero,@namezero,@idone,@nameone

end 

close Cur
Deallocate Cur
...