Tabelle mit Daten aus einer anderen Tabelle überschreiben - SQL

9

Unsere Benutzer möchten eine QS-Datenbank aus der Produktion aktualisieren, möchten jedoch, dass zwei Tabellen (nennen wir sie T1 und T2) die ursprünglichen QA-Daten beibehalten. Also habe ich zwei Tabellen von QA (DB1) in eine temporäre QA-Datenbank (DB2) kopiert. Dann DB1 aus der Produktion aktualisiert. Nach der Aktualisierung möchte ich T1- und T2-Daten von DB2 nach DB1 überschreiben, damit sie QA-Werte vor der Aktualisierung enthalten können.

Ich habe folgendes getan:

  1. Verwenden

    select * 
    INTO D1.dbo.T1
    FROM D2.dbo.T1
    
  2. Dann D1 von Prod aktualisiert

  3. Schneiden Sie dann T1 mit dem folgenden Schritt ab:

    SELECT COUNT(*) AS BeforeTruncateCount
    FROM T1;
    GO
    TRUNCATE TABLE T1;
    GO
    SELECT COUNT(*) AS AfterTruncateCount
    FROM T1;
    GO
    
  4. Wenn ich jetzt zurückkehre, um Daten von D2.T1 nach D1.T1 zu kopieren, wird die Fehlermeldung angezeigt, dass sich bereits ein Objekt mit dem Namen T1 in der Datenbank befindet.

Soll ich den Tisch fallen lassen und kopieren?

Oder gibt es eine bessere Methode für das gesamte Verfahren?

Rizwan
quelle

Antworten:

6

Um die Antworten von @Kin und @DavidSpillett zu kombinieren.

Zuerst eine Annahme. DB1 und DB2 befinden sich in derselben Instanz. Es klingt sicherlich so, als ob es so wäre, aber es tut nie weh, das Offensichtliche zu sagen (zumal ich mich geirrt habe mit dem, was ich vorher für offensichtlich gehalten habe).

Wenn die Daten groß sind, beispielsweise mehrere Millionen Zeilen, verwenden Sie ein SSIS-Paket. Dies hat eine spezielle Funktion, die Sie verwenden möchten. Sie können eine Stapelgröße angeben. Auf diese Weise wird Ihre Transaktionsgröße kleiner. Der Nachteil des SSIS-Pakets besteht darin, dass es Ihrem Prozess eine gewisse Komplexität verleiht. Es ist kein großer Tisch, aber wenn Sie mit einem kleineren Tisch arbeiten, brauchen Sie ihn nicht.

Was uns zu der anderen Option führt. Wenn die Daten jedoch im Bereich von mehreren hunderttausend oder kleiner liegen, verwenden Sie den folgenden Code.

USE D1;
GO
TRUNCATE TABLE dbo.T1;
GO
INSERT INTO D1.dbo.T1
SELECT * 
FROM D2.dbo.T1;
GO

Und zu guter Letzt, wenn es irgendwo an der Grenze ist, würde ich beides versuchen und sehen, was für Sie am besten funktioniert.

HINWEIS: Sie können auch in Betracht ziehen, a nicht in der Feldliste SELECT *zu verwenden INSERT INTOund stattdessen eine Feldliste anzugeben.

Diese Struktur würde so aussehen

INSERT INTO D1.dbo.T1 (Field1, Field2)
SELECT Field1, Field2
FROM D2.dbo.T1;
Kenneth Fisher
quelle
Danke für die Information. Ja, die Tabelle hat nur 7800 Zeilen, ist also ziemlich klein und befindet sich in derselben Instanz. Ich habe versucht, INSERT INTO (ohne Auswahl) zu verwenden, und es hat perfekt funktioniert. Vielen Dank, dass Sie dies teilen. Außerdem habe ich mit Import Data with SSMS getestet. Das hat auch super geklappt.
Rizwan
1
*Beachten Sie, dass Sie eine Feldliste angeben (und nicht verwenden ) müssen, wenn die Tabelle ein Einrückungsfeld enthält. Diese Werte können nicht einfach "kopiert" werden.
Conrad
6

IIRC mit der SELECT <stuff> INTO <target> FROM ...Syntax SQL Server geht immer davon aus, dass Sie die Zieltabelle von Grund auf neu erstellen möchten. Wenn die Tabelle bereits vorhanden ist, versuchen Sie es INSERT <target> SELECT <stuff> FROM ...stattdessen.

David Spillett
quelle
5
Darüber hinaus ist Davids Antwort auch eine bessere Route als DROP und SELECT INTO, wenn die Daten zurück nach D1 verschoben werden. Wenn Sie die D1-Tabellen löschen, verlieren Sie alle untergeordneten Objekte (z. B. Fremdschlüssel, Primärschlüssel, Trigger usw.). )
Delux
2
Ich stimme @Delux zu. Eine weitere wichtige Sache, die Sie verlieren werden, sind explizite Berechtigungen. Wenn ein Benutzer über spezifische Berechtigungen für diese Tabelle verfügt (anstatt zu sagen db_datareader), verlieren Sie diese Berechtigungen, wenn Sie die Tabelle löschen.
Kenneth Fisher
Das ist ein toller Tipp. Ich habe die Auswirkungen von DROP bis jetzt nicht verstanden. Vielen Dank!
Rizwan
6

Verwenden Sie dazu am besten SSIS (Datenimport / -export). Es hat die Funktionalität, nur ausgewählte Tabellen von der Quelle zum Ziel zu übertragen. Optional können Sie das Paket sogar speichern, damit es für zukünftige / wiederholte Übertragungen wiederverwendet werden kann.

BEARBEITEN: Hinzufügen weiterer Screenshots zur Verdeutlichung.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Kin Shah
quelle
wow .. danke für tolle Screenshots .. sie sind eine große Hilfe
Rizwan
Tolle Lösung, schöne Screenshots funktionieren!
Mayer Spitzer