2010-04-27 41 views
3

我有以下腳本,我用它來給我表之間的一個簡單的「差異」的兩個不同的數據庫。 (注:在現實中我比較了很多不僅僅是一個ID)SQL Server 2005中使用腳本跨數據庫服務器加入

SELECT 
    MyTableA.MyId, 
    MyTableB.MyId 
FROM 
    MyDataBaseA..MyTable MyTableA 
FULL OUTER JOIN 
    MyDataBaseB..MyTable MyTableB 
ON 
    MyTableA.MyId = MyTableB.MyId 
WHERE 
    MyTableA.MyId IS NULL 
OR 
    MyTableB.MyId IS NULL 

我現在需要在不同的服務器上存在兩個數據庫運行此腳本。目前我的解決方案是從一臺服務器備份數據庫,將其還原到另一臺服務器,然後運行腳本。

我敢肯定,這是可能的,但是,這是可能是忌諱的話題?這是我需要執行的非常罕見的任務,如果它涉及大量的數據庫設置更改,那麼我可能會堅持我的備份方法。

+0

爲什麼不考慮把地方SSIS包從一個服務器泵數據到另一個。這消除了與鏈接的服務器混亂的需要,性能也不會非常不同 – IMHO 2010-04-27 13:01:32

+0

這是對兩個數據庫上的幾張表進行一次性檢查。根本沒有要求維護數據。數據庫是不同的,應該是不同的。這只是一種健全性檢查的方法,只有那些應該不同的東西。 – 2010-04-27 13:10:05

回答

1

如果在SQL設置鏈接服務器,你可以運行常規查詢像這樣。 這是假設MyDatabaseB是你的鏈接服務器建立到遠程服務器上查詢被認爲具有MyDatabaseA在服務器上運行。

SELECT 
MyTableA.MyId, 
MyTableB.MyId 
FROM 
MyDataBaseA..MyTable MyTableA 
FULL OUTER JOIN 
LinkedServerName.MyDataBaseB.dbo.MyTable MyTableB 
ON 
MyTableA.MyId = MyTableB.MyId 
WHERE 
MyTableA.MyId IS NULL 
OR 
MyTableB.MyId IS NULL 
0

我也會推薦SSIS來代替。有兩個數據源select ID from MyTableA order by ID和一個select ID from MyTableB order by ID。 ORDER BY很重要,您需要進入高級編輯器並在兩個源中將輸出標記爲按ID排序。然後將這兩個源插入合併連接轉換並指定它是完全連接類型。然後,將連接的輸出插入到條件拆分變換中,並將非空A和B ID與A的ID或B的ID都爲NULL的行分開。這些最後的將是你的'差異'。

根據我的經驗,作爲表規模將越來越大,在SSIS解決方案將變得越來越有吸引力,作爲分佈式查詢生成會變得無法管理效率低下的計劃。