Als Folge eines Fehlers während eines Imports in eine Testtabelle namens CUSTOMERS musste ich die Werte zweier Spalten in SQL Server umstellen.
Ich habe fälschlicherweise die entsprechenden Werte für LASTNAME und FIRSTNAME in die gegenüberliegenden Felder importiert (d. h. der Nachname des Kunden wurde in den Vornamen importiert und umgekehrt). Um dies zu beheben, habe ich die folgende Abfrage in SQL Server 2008 R2 ausgeführt, natürlich nicht erwartet, dass es funktioniert:
%Vor%Überraschenderweise hat es funktioniert! Die begrenzte Programmiererfahrung, die ich gemacht habe (Highschool, ein paar College-Kurse), folgte immer dem Paradigma, dass das Umschalten zweier Werte das Vorhandensein einer dritten Variable erforderte, um den Wert eines der Anfangswerte zu "halten". Mit anderen Worten, ich erwartete, die folgende Abfrage ausführen zu müssen:
%Vor%Wird dieses Verhalten nur in SQL Server 2008 R2 angezeigt, oder stellt dies eine andere zugrunde liegende Facette der relationalen Theorie dar, die mir fehlt?
Es ist, weil die Art und Weise wie ein Update funktioniert:
In der set-Klausel konstruieren Sie eine Pseudo-Tabelle. Die Zeilen in dieser Tabelle werden erstellt, indem Werte aus den Spalten, die nicht in der ursprünglichen Zeile enthalten sind, in eine neue Zeile kopiert werden. Die Spalten sind alle auf einmal zugeordnet. Das heißt, die Arbeitseinheit ist eine Zeile, nicht eine Spalte gleichzeitig. Der letzte Schritt besteht darin, die alten Zeilen zu löschen und die neuen Zeilen einzufügen. Intern ist ein Update ausgewählt, löschen, einfügen.
Dies ist aus dem gleichen Grund, dass Sie keinen Spaltenalias in einer SELECT
-Liste definieren können, sondern den Alias an anderer Stelle in der gleichen SELECT
-Liste referenzieren. Joe Celko zu zitieren
Dinge passieren "auf einmal" in SQL, nicht "von links nach rechts" wie sie würde in einem sequentiellen Datei / prozeduralen Sprachmodell
Ausdrücke, die in der gleichen logischen Abfrageverarbeitungsphase erscheinen, werden wie zum selben Zeitpunkt ausgewertet. Weitere Informationen zu All-at-Once-Vorgängen finden Sie unter diesem Link
Es wird erwartet, dass SQL Update-Anweisungen gleichzeitig die Spalten aktualisieren, die in der UPDATE-Anweisung in den meisten DBMS angegeben sind. Es ist großartig, Dinge durch Erfahrung zu lernen:)
Tags und Links sql sql-server sql-server-2008 relational-database