2016-09-27 46 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