2016-03-24 6 views
0

Im Grunde kann ich nicht verstehen, was diese Abfrage unten tut:Probleme zu verstehen, diese Abfrage

UPDATE @so_stockmove 
SET @total_move_qty = total_move_qty = (
      CASE WHEN @so_docdt_id <> so_docdt_id THEN 0 
      ELSE ISNULL(@total_move_qty, 0) 
      END 
     ) + ISNULL(move_qty,0), 
    balance = so_qty - @total_move_qty, 
    @so_docdt_id = so_docdt_id 

Ich kann nur vermuten, dass es jede Zeile für die Spalten aktualisiert total_move_qty, balance, so_docdt_id.

Kann mir jemand im Detail erklären, was die Abfrage bedeutet:

UPDATE tbl SET @variable1 = columnA = expression 
+0

Dies wird als ** skurriles Update ** bezeichnet. Dies funktioniert nicht garantiert, und ich werde diese Methode niemals in der Produktion verwenden. –

+0

Dies ist eine schreckliche Art der Codierung SQL –

Antwort

2

aktualisieren
Nach @MotoGP Kommentare zu lesen, ich habe einige graben und fand this article von Jeff Moden wo er sagt folgendes:

Warnung:
Nun, irgendwie. Viele Leute (einschließlich einiger der "großen" Namen in der SQL-Welt) warnen vor und verurteilen die Methode, die in diesem Artikel enthalten ist, manchmal als "unzuverlässig" & "nicht unterstützt". Ein Kollege MVP nannte es sogar einen "undokumentierten Hack" auf der ziemlich aktuellen "24 Stunden von SQL". Selbst der Kern der Methode, die Fähigkeit, eine Variable von Zeile zu Zeile zu aktualisieren, wurde in ähnlicher Weise verflucht wie . Schlimmer noch, abgesehen von der Möglichkeit, 3-teilige Updates (SET @variable = Spaltenname = Ausdruck) durchzuführen und beide Variablen und Spalten gleichzeitig zu aktualisieren, gibt es absolut keine Microsoft Dokumentation zur Unterstützung der Verwendung dieser Methode in beliebig, Form oder Form. In der Tat hat sogar Microsoft erklärt, dass es keine Garantie gibt, dass diese Methode die ganze Zeit korrekt funktioniert.

Nun, lassen Sie mich Ihnen sagen, dass, abgesehen von einer Sache, das alles wahr ist. Die eine Sache, die nicht wahr ist, ist ihre angebliche Unzuverlässigkeit. Das ist ein Teil von das Ziel des Artikels ... seine Zuverlässigkeit zu beweisen (die wirklich kann nicht gemacht werden, wenn Sie es verwenden. Es ist wie die Zuverlässigkeit der die SELECT-Anweisung zu beweisen). Am Ende des Artikels, bilden Sie Ihre eigenen Geist. Wenn Sie entscheiden, dass Sie nicht eine so sehr alte, aber undokumentierte Funktion verwenden möchten, dann verwenden Sie eine Cursor- oder While-Schleife oder vielleicht sogar eine CLR, weil alle anderen Methoden einfach zu langsam sind. Heh ... hören Sie einfach auf, mir zu sagen, dass es ein undokumentierter Hack ist ... Ich weiß es bereits das und jetzt auch Sie. ;-)

Erstausgabe

Nun, diese Abfrage Updates Spalten total_move_qty und balance in einer Tabelle Variable @so_stockmove, und in der gleichen Zeit setzt Werte für die Variablen genannt @total_move_qty und @so_docdt_id genannt.

Ich wusste nicht, dass es möglich ist, Werte zu mehr als einem Ziel auf diese Weise in Sql-Server (@variable1 = columnA = expression) zuzuweisen, aber anscheinend ist das möglich.

Hier ist mein Test:

declare @bla char(1) 

declare @tbl table 
(
    X char(1) 
) 

insert into @tbl VALUES ('A'),('B'), ('C') 

SELECT * 
FROM @tbl 

UPDATE @tbl 
SET @Bla = X = 'D' 

SELECT * 
FROM @tbl 

SELECT @bla 

Ergebnisse:

X -- first select before update 
---- 
A 
B 
C 


X -- second select after update 
---- 
D 
D 
D 

---- select the variable value after update 
D 
+0

können Sie testen, ob 'D' eine Spalte aus einer anderen Tabelle war? –

+0

und wenn es möglich ist, wenn X auch eine andere Spalte war –

+0

@JoshuaRajandiran - Diese Methode funktioniert nicht garantiert –

0

Es nur den Wert der Variablen setzt und aktualisiert das Feld.