2016-09-27 47 views
-1

我们有一个旧数据库,我们维护一个新数据库,并且已经开始使用一个新数据库。我们需要定期将数据从旧数据库传输到新数据库。目前,我们需要传输或合并,因为它也可能被称为数据从一张表中 - 学生,旧数据库中的两张表格(即两个目标)在新的一个 - 学生。现在的问题是,来自旧的源数据库的数据应该在新数据库中的两个表中进行分配。例如(只是为了这个帖子的缘故),SQL将源表中的n行合并到两个目标

旧表 '学生'

------------------------------ 
IdNo | FirstName | LastName | 
578 | John  | Doe  | 
645 | Sara  | Doe  | 

新表 '人'

----------- 
Id | IdNo | 
11 | 578 | 
23 | 645 | 

新表 '学生'

-------------------------------------- 
Id | PersonId | FirstName | LastName | 
101| 11  | John  | Doe  | 
102| 23  | Sara  | Doe  | 

并且该过程应该采用要合并的行数的参数。
这怎么能完成?

更新

,也许会更容易让你们知道我的伪代码的含义是:

MERGE [NewDB].[dbo].[Person] p, [NewDB].[dbo].[Student] ns -- 2 targets, this does not work 
USING [OldDB].[dbo].[student] os    -- source table, old student 
ON p.IdNo = s.IdNo 
WHEN MATCHED THEN        -- Update existing rows 
    UPDATE p 
    SET p.SomeCoumn1 = os.SomeColumn1  -- works. os (old student) is know here 
    UPDATE ns 
    SET ns.SomeColumn2 = os.SomeColumn2  -- Does not work. os is not known here 
WHEN NOT MATCHED BY TARGET THEN     -- Add new rows 
    INSERT INTO p (IdNo, SomeOlumn1) 
    VALUES (os.Idno, os.SomeColumn1);   -- os (old Studnet) is known here 
    INSERT INTO ns (SomeColumn2)  
    VALUES (os.SomeColumn2);     -- Does not work. os is not knwon here 

我希望这使得它更为清楚。

+1

你到目前为止尝试了什么? –

+0

哪里来的人物? –

+1

为什么不把名字和姓氏放在新人表中呢? – jarlh

回答

1

我们可以假设你想在一个语句而不是两个语句中执行此操作的原因是,如果您要插入的第一个表中的字段是身份字段(示例中的Person表中的Id),则该字段为需要插入到第二个表中?

如果是这样,请在第一个合并语句中添加一个OUTPUT子句,以便您具有第二个合并语句所需的关系和字段。

declare @OldStudent table (IdNo int, FirstName varchar(30), LastName varchar(30)) 

declare @Person table (Id int identity, IdNo int) 

declare @NewStudent table (Id int identity, PersonId int, FirstName varchar(30), LastName varchar(30)) 

insert @OldStudent (IdNo, FirstName, LastName) 
select 578, 'John', 'Doe' 
union all select 645, 'Sara', 'Doe' 

declare @output table ([Action] varchar(20), PersonId int, IdNo int) 

MERGE @Person p 
USING @OldStudent os   
ON p.IdNo = os.IdNo 
WHEN MATCHED THEN        -- Update existing rows 
    UPDATE SET IdNo = os.IdNo 
WHEN NOT MATCHED BY TARGET THEN     -- Add new rows 
    INSERT (IdNo) VALUES (os.Idno) 
OUTPUT $action, inserted.Id, inserted.IdNo into @output; 

WITH src AS 
(
    select 
     o.IdNo, o.PersonId, os.FirstName, os.LastName 
    from 
     @output o 
     inner join @OldStudent os on os.IdNo = o.IdNo 
) 
MERGE INTO @NewStudent as ns 
USING src 
ON src.PersonID = ns.PersonID 
WHEN MATCHED THEN        
    UPDATE SET FirstName = src.FirstName, LastName = src.LastName 
WHEN NOT MATCHED BY TARGET THEN     -- Add new rows 
    INSERT (PersonID, FirstName, LastName) VALUES (src.PersonID, src.FirstName, src.LastName); 


select * from @Person 
select * from @NewStudent 
+0

哇,这是令人印象深刻的!你的答案是完美的布莱恩。非常感谢! – ashilon