Ich verschiebe Datensätze als Teil des Archivierungsprozesses von einer Datenbank in eine andere. Ich möchte die Zeilen in die Zieltabelle kopieren und dann dieselben Zeilen aus der Quelltabelle löschen.
Meine Frage ist, was ist der effizienteste Weg, um zu überprüfen, ob die erste Einfügung erfolgreich war, bevor die Zeilen gelöscht wurden.
Meine Idee ist dies, aber ich denke, es gibt einen besseren Weg:
@num_records=select count(ID) from Source_Table where (criteria for eligible rows)
insert * into Destination_Table where (criteria for eligible rows)
if ((select count(ID) from Destination_Table where (criteria) )=@numrecords)
delete * from Source_Table where (criteria)
Ist es besser / möglich, es mit der RAISERROR-Funktion zu kombinieren? Danke!
quelle
OUTPUT
Klausel möglich ist? Es ist nicht, weil es nur eine Aussage ist. Vermeidet auch das Problem, die Zeilen zweimal lesen zu müssen (und möglicherweise Zeilen zu verlieren, die zwischen dem Lesen für die Einfügung und dem Lesen für das Löschen hinzugefügt wurden)Die Art und Weise, wie ich über die Archivierung nachgedacht habe (was sicher auch nicht perfekt ist), besteht darin, der neuen Archivtabelle eine Bitspalte wie "Archiviert" hinzuzufügen, die nach erfolgreicher Übertragung eines Datensatzes den Wert 1 hätte. Sobald Sie alle Datensätze übertragen haben, können Sie einen Löschvorgang ausführen und gleichzeitig nach dem Feldwert 'Archiviert' von '1' suchen, dh True aus der archivierten Tabelle.
Und ich stimme Mike bei der Verwendung von Try / Catch zu.
quelle
Versuche dies:
quelle