Sql 将一个表中的数据插入多个表

Sql 将一个表中的数据插入多个表,sql,sql-server,data-migration,Sql,Sql Server,Data Migration,我正在使用SQLServer2005 我正在将数据从当前数据库(单个表)迁移到新数据库(规范化-多个表)。在新数据库中,我有一个基表(我们称之为“BaseTable”)和多个其他表(我们称它们为“DependentA”,和“DependentB”)。旧数据库中的一些数据将进入BaseTable,另一些数据将进入其他两个数据库。BaseTable与DependentA和DependentB都有一对一的关系,使用它们的Id作为外键 这是我的问题。我应该如何通过网络迁移数据?这是我一直在尝试的一个查询

我正在使用SQLServer2005

我正在将数据从当前数据库(单个表)迁移到新数据库(规范化-多个表)。在新数据库中,我有一个基表(我们称之为“BaseTable”)和多个其他表(我们称它们为
“DependentA”
,和
“DependentB”
)。旧数据库中的一些数据将进入BaseTable,另一些数据将进入其他两个数据库。BaseTable与DependentA和DependentB都有一对一的关系,使用它们的Id作为外键

这是我的问题。我应该如何通过网络迁移数据?这是我一直在尝试的一个查询,除了一件事外,其他两个查询的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
将光标@curs声明为
从旧数据库中选择c1、c2、c3、c4、c5
打开@curs
从@curs获取下一个到
@c1、@c2、@c3、@c4、@c5——申报这些!
当@@fetch\u状态为0时
开始
将@c1、@c2的值插入DependentA(第1列、第2列)
选择@dep1Id=Scope\u Identity()
将@c3、@c4的值插入DependentB(第3列、第4列)
选择@dep2Id=Scope\u Identity()
将@c5、@dep1Id、@dep2Id插入基表(第5列,部门1ID,部门2ID)
从@curs获取下一个到
@c1、@c2、@c3、@c4、@c5
结束
关闭@curs
取消分配@curs

我的游标语法可能有很多错误,但你明白了。

为了避免大型数据集使用游标,请在新表中临时包含旧表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表和从旧表中规范化的任何其他表执行相同的操作


数据迁移后删除旧表\u id。

[在此处输入图像描述][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

依赖表中的任何列是否具有可以查找的唯一值?(即c1和c3)这些表中有一个主键(DependentA和DependentB)。游标对于大型数据集是不可行的,即使对我来说最糟糕的是261000行。我不确定这个答案,对于一篇7年的帖子,会给线程增加很多价值。。。
DECLARE @Product_Name varchar(50),@Generic_Name varchar(50),@Category_Name varchar(50),@Manufacture_Name varchar(50),
@UOM_Name varchar(50),@ProductId int,@GenericId int,@CategoryId int,@ManufactureId int,@UOMId int

DECLARE MultiplTable CURSOR FOR
SELECT ProductName,GenericName,CategoryName,ManufacturerName,UOMName from Noor_ProductList

open MultiplTable
fetch next from MultiplTable into
@Product_Name,@Generic_Name,@Category_Name,@Manufacture_Name,@UOM_Name --declare these!

while @@fetch_status = 0
BEGIN
INSERT INTO Noor_GenericMaster(GenericName) VALUES (@Generic_Name) 
SELECT @GenericId = Scope_Identity()

INSERT INTO Noor_CategoryMaster(CategoryName) VALUES (@Category_Name) 
SELECT @CategoryId = Scope_Identity()

INSERT INTO Noor_ManufaturerMaster(ManufaturerName) VALUES (@Manufacture_Name) 
SELECT @ManufactureId = Scope_Identity()

INSERT INTO Noor_UOMMaster(UOMName) VALUES (@UOM_Name)
SELECT @UOMId = Scope_Identity()

INSERT INTO Noor_ProductMaster (ProductName,GenericID,CategoryID,ManufaturerID,UOMID)
values (@Product_Name,@GenericId,@CategoryId,@ManufactureId,@UOMId)
SELECT @ProductId = Scope_Identity()  

fetch next from MultiplTable into @Product_Name,@Generic_Name,@Category_Name,@Manufacture_Name,@UOM_Name

END
close MultiplTable
deallocate MultiplTable