Wechseln der Werte von zwei Feldern / Spalten in SQL Server ohne dritte Variable

8

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?

    
TelJanini 13.10.2011, 14:51
quelle

4 Antworten

5

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.

    
user989818 13.10.2011, 14:59
quelle
4

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

    
Martin Smith 13.10.2011 15:01
quelle
2

Ich nehme an, die Quellwerte werden zuerst vorbereitet (und somit in einem internen dritten Halter gespeichert) und anschließend angewendet.

    
CyberDude 13.10.2011 14:55
quelle
0

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:)

    
Allan Chua 13.10.2011 15:24
quelle