2013-07-26 4 views
5

In einer "religiösen" Diskussion über die Formatierung von Microsoft T-SQL-Code fragte ich, ob die GOTO-Anweisung noch in T-SQL-Syntax verfügbar war. In den 13 Jahren, in denen ich T-SQL benutzt habe, hatte ich nie Gelegenheit, es zu benutzen, und wusste auch nicht, ob es existierte. Nach einer kurzen Suche in der Dokumentation und zu meiner Bestürzung existiert es tatsächlich! dieseIn welchem ​​Fall wäre die Verwendung einer T-SQL GOTO-Anweisung akzeptabel?

ist Meine Frage:

Gibt es mindestens einen Fall wo GOTO-Anweisungen eine Lösung ergeben würden, die führt besser als eine, in der anderen höheren Ordnung Programmierkonstrukte verwendet werden?

  • Verschlüsselungsalgorithmus Implementierung

Meine Frage NICHT ist:

  • Wie kann ich kleine Stücke von Funktionalität verwenden, ohne eine ganze Funktion zu schaffen, dies zu tun?
  • Wie repliziere ich die Fehlerbehandlung ohne Kopieren/Einfügen?
+0

Ich löste einmal eine Frage, wo gehe nötig war: http://stackoverflow.com/questions/7244617/data-grouping-according-to-relevant-values-in-sql-server/7254163#7254163 –

+0

@ t-clausen.dk Das muss definitiv als Antwort aufgelistet werden! Es ist eine interessante und einzigartige Verwendung von GOTO sicher! Irgendwelche Gedanken darüber, warum du keine While-Schleife benutzt hast? –

+0

das könnte auch mit 'WHILE' gemacht worden sein :) –

Antwort

4

Ich benutze fast nie GOTO und kann leicht ohne es leben.

Der eine Fall, in dem ich es in Betracht ziehen würde, ist, wenn ich komplizierten Code habe, der viele Fehlerüberprüfungen durchführt. Ich möchte vielleicht etwas unternehmen, wenn ein Fehler zurückkehrt, und GOTO ermöglicht es mir, einen einzelnen Codeblock für die Fehlerprüfung zu definieren.

Sie können dieses Problem auf mehrere Arten lösen, aber GOTO ist eine sinnvolle Option, die garantiert, dass Fehler konsistent verarbeitet werden und der Code nicht mit vielen if @Error = 0 . . . Anweisungen überladen ist.

+1

Ich nehme an, was Sie hier beziehen, ist katastrophale Fehlerbehandlung für Dinge wie 5 Anweisungen, die fehlschlagen könnten und wenn einige von ihnen fehlschlagen, verwenden Sie nur einen einzigen Fehlerbehandlungsblock. –

+0

Es scheint, als ob diese Situation jetzt mit der in neueren Iterationen von SQL Server verfügbaren try-catch-Semantik größtenteils vermeidbar ist. @Gordon Linoff, hast du die beiden Methoden verglichen? –

+1

@NormanH. . . 'try/catch' Blöcke ersetzen nicht' GOTO' und Fehlerbehandlung. Der Fehlerbehandlungscode ist im Wesentlichen "Exit" -Code für die gespeicherte Prozedur, zum Beispiel um Fehler zu protokollieren, wenn einer gefunden wird.Der "try/catch" -Block fängt den Fehler ab (und verarbeitet ihn möglicherweise, aber der Punkt des Codes zur Verarbeitung von häufig auftretenden Fehlern besteht darin, zu vermeiden, dass derselbe Code immer wieder wiederholt wird). –

2

Ich sah ein paar Mal in großen Skripten, wo Menschen es zur Verbesserung der Lesbarkeit verwendet. manchmal ist es besser lesbar, aber meistens wird es zu Spaghetti-Code.

Ich sehe nur eine Situation, in der Goto vielleicht besser durchführen kann. es ist in einer Multiple-While-Schleife enthalten. Sie können goto einmal statt multiple breaks verwenden, die nur die innerste Schleife existiert. Trotzdem ist Break meiner Meinung nach nicht viel besser als Goto, es ist kein guter Programmierstil.

while ... 
    while ... 
    while... 
    break 
    break 
break 


while ... 
    while ... 
    while... 
    goto endloops 

endloops: 
+0

Das ist eine großartige Antwort und ein einzigartiger Ansatz. Der Schutz vor Spaghetti-Code ist eine Herausforderung - das kann aber auch bei voller Nutzung der Funktionen passieren! –

Verwandte Themen