2017-07-24 22 views
0

Ich habe ein seltsames Problem hier, ich versuche, einige Daten in eine neue Tabelle in SQL Server zu laden. Die Tabelle hat seit 2015 bis heute nur wenige Millionen Datensätze. Wenn ich versuche, ganze Daten zu laden, läuft es für ungefähr 2 Stunden, bevor es stoppt und einen FehlerSQL Server - INSERT INTO überschreibt vorhandene Daten

Transaction log - Full auslöst.

Also, was ich versuche, den Zeitrahmen in 2 Teile in WHERE Klausel YEAR >= 2016 und Werte einfügen und ändern Sie dann die INSERT Anweisung YEAR >= 2015 AND YEAR < 2016 zu tun ist, brechen. Wenn ich das tue, überschreibt es die vorhandenen 2016 Daten, aber nicht die 2017 Daten. Also im Grunde das ganze 2016 gibt nichts zurück.

Fehle ich etwas?

Es ist wirklich ärgerlich, da ich Stunden damit verbringe, nur Daten zu laden.

-Code

INSERT INTO <tablename> 
    SELECT * 
    FROM 
     (SELECT <columnnames> 
     FROM <few join statements> 
     WHERE <calendaryear >= 2016 
     GROUP BY <statements>) a -- this loads data from 2016 to present. 

INSERT INTO <tablename> 
    SELECT * 
    FROM 
     (SELECT <columnnames> 
     FROM <few join statements> 
     WHERE <calendaryear >= 2015 AND calendaryear < 2016 
    GROUP BY <statements>) a --this loads data from 2015 to 2016 

die zweite Anweisung wird der ehemalige überschrieben Nach der Ausführung. Hier habe ich als 2 separate Abfragen gezeigt, aber in Wirklichkeit ich nur die Kalenderauszüge Aussagen kommentieren und als 2 separate Abfragen ausführen.

Danke.

+0

Stellen Sie Ihren Wiederherstellungsmodus auf einfache Wiederherstellung. Das sollte bei den Log-Überläufen helfen. –

+0

Leider ist das mein DBA-Job, den ich nicht tun kann. Mein Anliegen ist die Abfrage selbst. – sqlearner

+0

Wenn Sie 'INSERT INTO' verwenden, dann überschreibt _it die vorhandenen 2016 Daten, aber nicht die 2017 Daten_ macht keinen Sinn. Haben Sie überprüft, dass Sie Daten von 2016 in der Zieltabelle haben, bevor Sie die Einfügung von "2015 <= Jahr und Jahr <2016" ausführen? –

Antwort

0

Ist es möglich, dass die frühere Aussage nie begangen wurde? Ein Rollback ist vor der zweiten Aussage passiert?

+0

Nein, das glaube ich nicht. Gibt es eine Möglichkeit? Ich arbeite tatsächlich in einer Sandbox im Produktionsserver. – sqlearner

+0

Sofern Sie nicht explizit eine transact-Anweisung verwenden, würde ein Fehler generiert, wenn die erste Anweisung die Protokolle füllt, und die erste Anweisung würde zurückgesetzt. Die zweite Anweisung würde erfolgreich ausgeführt werden, vorausgesetzt, die Protokolle werden nicht gefüllt. Ich denke, Sie müssen einen Weg finden, um die Protokolle zu umgehen oder Ihre DBA bitten, die Protokollgröße zu erhöhen, oder Sie werden für immer versuchen, Ihre Anfrage in kleine genug Brocken zu brechen. – LAS

0

Es ist ein paar Jahre her, seit ich mit SQL Server gearbeitet habe, aber ich glaube, der Befehl BCP (Massenladen) wird die Protokolle umgehen. Sie sollten dafür keinen DBA benötigen.