2016-04-25 197 views
0

假設我們在位於不同數據庫服務器的兩個數據庫中有兩個表。從一個SQL表複製數據並將其插入到另一個表中

的情況是這樣的
步驟1:從第一表中選擇的數據。
步驟2:遍歷所述第一步驟的結果
步驟2.1:對於每一行中不存在在socond表
步驟2.2:如果步驟的結果2.1爲真,將行插入到第二個表中。

萬一臺處於同一臺服務器下面的SQL查詢工作正常:

INSERT INTO server.table2(id, name, adresse) 
SELECT * FROM server.table1 WHERE table2.id NOT IN (SELECT id FROM server.table2) 

但我有一個問題,當源表和目標表分佈在兩個不同的數據庫服務器。

如何才能實現上述步驟?

回答

1

通常處理此問題的最佳方法是將數據批量複製到臨時表中,然後您可以像執行常規查詢那樣執行數據。

我不知道你的模型,所以我把它作爲一個實驗留在如何用List實現,但如果你可以一次打開兩個連接,你可以很容易地使用SqlBulkCopy這樣做來在兩臺服務器。

using (var sourceConnection = new SqlConnection(sourceConnectionString)) 
using (var destinationConnection = new SqlConnection(destinationConnectionString)) 
{ 
    sourceConnection.Open(); 
    destinationConnection.Open(); 

    var createTableQuery = "create table #t (id uniqueidentifier, name nvarchar(100), adresse(nvarchar(100))"; 
    using (var createTableCommand = new SqlCommand(createTableQuery, destinationConnection)) 
    { 
     createTableCommand.ExecuteNonQuery(); 
    } 

    using (var selectCommand = new SqlCommand("SELECT id, name, adresse FROM table1")) 
    using (var selectReader = selectCommand.ExecuteReader()) 
    using (var destBulkInsert = new SqlBulkCopy(destinationConnection)) 
    { 
     destBulkInsert.DestinationTableName = "#t"; 
     destBulkInsert.WriteToServer(selectReader); 
    } 

    var mergeQuery = "INSERT INTO table2(id, name, adresse) SELECT * FROM #t WHERE #t.id NOT IN(SELECT id FROM table2)"; 
    using (var mergeCommand = new SqlCommand(mergeQuery, destinationConnection)) 
    { 
     mergeCommand.ExecuteNonQuery(); 
    } 
} 
+0

嘿斯科特,非常感謝你的回答我的問題。我試着像你建議的那樣,通過執行命令(createTableCommand.ExecuteNonQuery();)我得到了一個SqlExeption錯誤:錯誤說:在SqlTestConnection.exe中發生未處理的異常類型'System.Exception' – gawgaw

+0

使用調試器[copy例外詳情](https://blogs.msdn.microsoft.com/saraford/2008/08/07/did-you-know-you-can-copy-the-exception-details-with-one-click-from - 例外助理-276 /)作爲你的問題的編輯 –

0
  1. 在創建鏈接服務器和

    EXEC master.dbo.sp_addlinkedserver @server = N'server2' ,@ srvproduct = N'SQL服務器」

    EXEC master.dbo .sp_addlinkedsrvlogin @ rmtsrvname的數據類型= N'server2' ,@ useself = N'False '@ locallogin的= NULL,@歸爲rmtuser = N'USER_NAME',@ rmtpassword = '########'

  2. 執行您的查詢fr OM 作爲

    使用dbName1

    INSERT INTO server2.dbName2.dbo.table2(ID,姓名,住址)
    SELECT * FROM dbo.table1 T1
    左連接server2.dbName2.dbo在t1.id = t2.id
    .table2 T 2,其中t2.id爲空

相關問題