Meine Datenbank enthält drei Tabellen genannt Object_Table
, Data_Table
und Link_Table
. Die Verknüpfungstabelle enthält nur zwei Spalten, die Identität eines Objektdatensatzes und eine Identität eines Datensatzes.
Ich möchte die Daten kopieren, von DATA_TABLE
denen sie mit einer bestimmten Objektidentität verknüpft sind, und entsprechende Datensätze in Data_Table
und Link_Table
für eine andere bestimmte Objektidentität einfügen .
Ich kann dies tun, indem ich in eine Tabellenvariable wähle und die Schleife durch zwei Einfügungen für jede Iteration mache.
Ist das der beste Weg, es zu tun?
Bearbeiten : Ich möchte eine Schleife aus zwei Gründen vermeiden: Der erste Grund ist, dass ich faul bin und eine Schleifen- / temporäre Tabelle mehr Code erfordert. Mehr Code bedeutet mehr Stellen, an denen Fehler gemacht werden können, und der zweite Grund ist ein Problem mit der Leistung.
Ich kann alle Daten in einer Einfügung kopieren, aber wie kann die Verknüpfungstabelle mit den neuen Datensätzen verknüpft werden, in denen jeder Datensatz eine neue ID hat?
quelle
Antworten:
In einer Aussage : Nein.
In einer Transaktion : Ja
Die gute Nachricht ist, dass der obige Code garantiert auch so ist atomar ist und von einer Clientanwendung mit einer SQL-Zeichenfolge in einem einzelnen Funktionsaufruf an den Server gesendet werden kann, als wäre es eine Anweisung. Sie können auch einen Trigger auf eine Tabelle anwenden, um den Effekt einer einzelnen Einfügung zu erzielen. Letztendlich sind es jedoch immer noch zwei Anweisungen, und Sie möchten wahrscheinlich nicht den Auslöser für jede Einfügung ausführen .
quelle
insert into ... select ...
Aussage. Wie liest oder durchläuft der obige Code die Object_Table-Daten? Sie müssen dann noch eine Tabellenvariable verwenden, die der Fragesteller nicht tun wollte.Sie benötigen noch zwei
INSERT
Anweisungen, aber es hört sich so an, als ob Sie die AnweisungenIDENTITY
aus der ersten Einfügung abrufen und in der zweiten verwenden möchten. In diesem Fall möchten Sie möglicherweise Folgendes prüfenOUTPUT
oderOUTPUT INTO
: http://msdn.microsoft.com/en- us / library / ms177564.aspxquelle
Im Folgenden wird die Situation anhand von Tabellenvariablen beschrieben.
Dank einer weiteren Antwort , die mich auf die OUTPUT-Klausel hinwies, kann ich eine Lösung demonstrieren:
Es stellt sich jedoch heraus, dass es im wirklichen Leben aufgrund des folgenden Fehlers nicht so einfach ist
Ich kann noch
OUTPUT INTO
eine temporäre Tabelle erstellen und dann mit normaler Einfügung fertig werden. So kann ich meine Schleife vermeiden, aber ich kann die temporäre Tabelle nicht vermeiden.quelle
Es hört sich so an, als würde die Link-Tabelle die Many: Many-Beziehung zwischen der Object-Tabelle und der Data-Tabelle erfassen.
Mein Vorschlag ist, eine gespeicherte Prozedur zum Verwalten der Transaktionen zu verwenden. Wenn Sie in die Objekt- oder Datentabelle einfügen möchten, führen Sie Ihre Einfügungen durch, holen Sie sich die neuen IDs und fügen Sie sie in die Verknüpfungstabelle ein.
Auf diese Weise bleibt Ihre gesamte Logik in einem einfach zu rufenden Sproc zusammengefasst.
quelle
Wenn Sie möchten, dass die Aktionen mehr oder weniger atomar sind, würde ich sicherstellen, dass sie in eine Transaktion eingeschlossen werden. Auf diese Weise können Sie sicher sein, dass beide nach Bedarf passiert sind oder nicht.
quelle
Sie können eine Ansicht erstellen, in der die für Ihre Einfügeanweisung erforderlichen Spaltennamen ausgewählt werden, einen INSTEAD OF INSERT-Trigger hinzufügen und in diese Ansicht einfügen.
quelle
Ich möchte die Verwendung betonen
für die MSSQL-Transaktion mit mehreren SQL-Anweisungen.
Siehe: https://msdn.microsoft.com/en-us/library/ms188792.aspx Sie bieten ein sehr gutes Beispiel.
Der endgültige Code sollte also wie folgt aussehen:
quelle
Insert kann jeweils nur an einem Tisch ausgeführt werden. Mehrere Einfügungen müssen mehrere Anweisungen haben.
Ich weiß nicht, dass Sie eine Tabellenvariable durchlaufen müssen - können Sie nicht einfach eine Masseneinfügung in eine Tabelle und dann die Masseneinfügung in die andere Tabelle verwenden?
Übrigens - ich vermute, Sie meinen, Sie kopieren die Daten von Object_Table. sonst macht die frage keinen sinn.
quelle
Bevor Sie in Oracle eine multitable Einfügung durchführen können, können Sie einen Trick verwenden, bei dem eine Einfügung in eine Ansicht mit einem INSTEAD OF-Trigger zum Ausführen der Einfügungen definiert wird. Kann dies in SQL Server durchgeführt werden?
quelle
quelle
// wenn Sie dasselbe wie die erste Tabelle einfügen möchten
// oder wenn Sie bestimmte Teile der ersten Tabelle einfügen möchten
// Ich weiß, es sieht zu gut aus, um richtig zu sein, aber es funktioniert und Sie können weiterhin Abfragen hinzufügen, indem Sie einfach die ändern
Ich habe 17 Tabellen, in denen dies funktioniert hat.
quelle