2014-07-18 90 views
0

我試圖從2個不同服務器上的2個數據庫合併2個表。從2個數據庫合併sql語句

現在,我創建了一個服務器鏈接的服務器,我用這樣的查詢:

MERGE INTO tablename1 as T1 
using linkedservername.dbname.tablename2 as T2 ON 
WHEN MATCHED THEN 
    UPDATE SET ... 
WHEN NOT MATCHED THEN 
    INSERT ... 

我想知道是否有一個解決方案,並且不用創建鏈接的服務器。

+1

複製是您的選擇嗎? –

+0

不幸的不是。我在SSIS包中使用此查詢,並且2個表的結構不相同。 –

+0

會[此](http://msdn.microsoft.com/en-us/library/ms187569.aspx)有用嗎?主題是:_Ad Hoc分佈式查詢_ –

回答

0

在SSIS中有三種常用的方法可以做到這一點。但是,如果您在線查詢,則有更多信息。

無論哪種方式,您首先需要在SSIS中創建連接管理器,直接指向您的鏈接服務器。從那開始。

然後創建一個數據流任務,你select from dbname.tablename2在數據流源

然後你就可以做到這一點的幾種方法:

A.臨時表

轉儲導致到一個臨時表然後在後續的SQL Task中本地運行您的合併語句。除非您不允許在目標中創建表格/數據,否則這通常是最快(最簡單)的方式。

B.查找

使用查找在您的數據流,以確定如果記錄存在與否,其次是OLEDB目標(插入)或OLEDB命令(更新)

這是通常速度較慢,因爲查找和更新效率都不高。

C.行級合併

飼料結果爲OLEDB命令,並直接把你的合併在那裏

這可能是最慢的。

如果您需要更多信息,請將您的連接管理器分類並回傳。

+0

我已經嘗試了所有這些ssis解決方案,並且他們對於大桌子來說太慢了。我創建了使用sql merge語句的自定義任務ssis,它工作正常。但我有義務創建一個鏈接的數據庫,當我的2個表不在同一臺服務器上時。因此我的問題。 –

+0

你嘗試了分階段的方法(1)嗎?這應該是最快的。在本地分級所有數據。運行一個更新查詢和一個插入查詢。爲您插入和更新優化索引 –

+0

對不起,但我的問題不是「如何在ssis中做到這一點」。我知道如何在ssis中做到這一點,謝謝。我不知道是誰給我的問題添加了標誌ssis,但這是一個錯誤。我只關心sql語句的問題。 –