2016-04-25 21 views
0

Angenommen, dass wir zwei Tabellen in zwei Datenbanken, die in verschiedenen Datenbank-Servern befinden.Kopieren von Daten aus einer SQL-Tabelle und fügen Sie ihn in eine andere Tabelle

Die Situation ist dies:
Schritt 1: Wählen Sie Daten aus der ersten Tabelle.
Schritt 2: Iterieren über das Ergebnis des ersten Schritts
Schritt 2.1: Für jede Zeile, die
Schritt 2.2 nicht in der Socond Tabelle ist: Wenn das Ergebnis der Schritt 2.1 gilt , fügen Sie die Zeile in die zweite Tabelle ein.

Falls die Tische sind in demselben Server die folgende SQL-Abfrage funktioniert:

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

Aber ich habe ein Problem, wenn die Quelltabelle und Zieltabelle in zwei verschiedenen Datenbankserver verteilt werden.

Wie kann ich erkennen, die oben beschriebenen Schritte?

Antwort

1

Der beste Weg, um dies in der Regel zu handhaben ist Massenkopieren in eine temporäre Tabelle die Daten dann können Sie Ihre normale Abfrage wie Sie tun würde.

Ich kenne Ihre Modelle nicht, also überlasse ich es Ihnen als Experiment, wie man das mit einer Liste macht, aber wenn Sie zwei Verbindungen auf einmal öffnen könnten, können Sie dies einfach mit SqlBulkCopy tun die zwei Server.

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

Hey Scott, Vielen Dank, meine Frage zu beantworten. Ich habe versucht, wie Sie vorgeschlagen, Bit Ich habe einen Fehler SqlExeption durch Ausführen des Befehls (createTableCommand.ExecuteNonQuery();) Der Fehler sagt: Eine nicht behandelte Ausnahme vom Typ 'System.Exception' aufgetreten in SqlTestConnection.exe – gawgaw

+0

Verwenden Sie den Debugger, [kopieren die Ausnahmedetails] (https://blogs.msdn.microsoft.com/saraford/2008/08/07/did-you-know-you-can-copy-the-exception-details-with-one-click-from -the-exception-assistant-276 /) als Bearbeitung für Ihre Frage –

0
  1. Auf create-Server verbunden und

    EXEC master.dbo.sp_addlinkedserver @server = N'server2' , @ srvproduct = N'SQL Server‘

    EXEC master.dbo .sp_addlinkedsrvlogin @ rmtsrvname = N'server2' , @ useself = N'false '@ local = NULL, @ rmtuser = N'USER_NAME', @ rmtpassword = '########'

  2. Execute Ihre Anfrage fr om als

    Verwendung dbName1

    INSERT INTO server2.dbName2.dbo.table2 (id, name, adresse)
    SELECT * FROM dbo.Table1 t1
    gehen server2.dbName2.dbo LEFT JOIN .table2 t2 auf t1.id = t2.id
    wo t2.id null ist

Verwandte Themen