Wenn vorhanden – Wählen Sie Wiederholten Code verhindern

Wir erhalten eine Bestellliste und überprüfen, ob sie mit bestimmten Präfixen beginnt, z. B. wenn OrderNumber nicht mit ABC beginnt, als Anzeige Bestellliste an Benutzer als Fehler. Wir verwenden exist, um nach der ersten Existenz zu suchen, wollen nicht viel Leistungszeit verbrauchen. Wenn keine existiert, können wir damit beginnen, andere Aufgaben im Code auszuführen.

Gibt es in SQL sowieso etwas zu entfernen Der sich wiederholende Code? Wir haben viele derartige Überprüfungen für mehrere Tabellen, um den Code effizienter zu gestalten.

if exists ( select * from dbo.OrdersImport where left(OrderNumber,3) <> "ABC" ) begin select OrderNumber as OrderErrorList from dbo.OrdersImport where left(OrderNumber,3) <> "ABC" end else 

Antwort

Leider habe ich Angst, wenn Sie versuchen, das Wiederholen von Code zu verhindern, schreiben Sie möglicherweise mehr Code und machen die Abfrage weniger lesbar. Ich glaube jedoch, dass dies für Sie von Vorteil sein kann – berücksichtigen Sie Situationen, in denen Sie im Test nur in einer oder zwei Tabellen suchen müssten, um alle Details abzurufen, müssen Sie sich mehreren weiteren anschließen. In solchen Situationen können Sie die Testabfrage vereinfachen und so die Ausführung beschleunigen.

Und wenn wir schon dabei sind, können Sie auch Ihre WHERE-Anweisung ändern. Die Verwendung von Funktionen im Prädikat macht sie nicht SARG-fähig und verhindert in diesen Fällen die Verwendung von Indizes. Ein besserer Ansatz in diesem Beispiel wäre,

WHERE OrderNumber LIKE "ABC%" 

zu überprüfen, da der Optimierer eine Konvertierung in etwas nach dem Vorbild von

, das die Verwendung von Indizes unterstützt. Dies wäre also Index-Scan (mit left ()) im Vergleich zu Index-Suche (mit LIKE).

Antwort

Leider für Eine Vielzahl von Gründen (nicht nur Legacy) SQL verfügt nicht über fast alle Optionen und Funktionen zur Wiederverwendung von Code, die die meisten Client-Sprachen bieten, und einige von ihnen (wie skalare UDFs) weisen erhebliche Probleme auf. Wenn Sie also ein effektiver SQL-Programmierer sein möchten, müssen Sie sich damit abfinden, viel mehr Code zum Ausschneiden und Einfügen wiederzuverwenden, als Sie jemals in einer Client-Sprache wie C #, VB in Betracht ziehen würden. Net oder Java.

Das heißt, Sie können die Redundanz in Ihrem Beispiel beseitigen. Ob es jedoch tatsächlich besser ist oder nicht, müssen Sie entscheiden.

Declare @OrderErrorList Table(OrderNumber varchar(32)); Insert into @OrderErrorList select OrderNumber as OrderErrorList from dbo.OrdersImport where left(OrderNumber,3) <> "ABC"; if exists ( select * from @OrderErrorList ) begin select * from @OrderErrorList end else 

Kommentare

  • Können Sie dies weiter vereinfachen, indem Sie @@ ROWCOUNT überprüfen, anstatt zu existieren?
  • @mathewb Ja, aber es muss sofort nach dem INSERT..SELECT erfolgen. Wenn Sie eine weitere Aussage hinzufügen, funktioniert sie plötzlich nicht mehr richtig und ich versuche, solche Landminen in meinen Antworten zu vermeiden. Die Problemumgehung wäre, das @@ ROWCOUNT in einer Variablen zu speichern, aber dann wäre es nicht wesentlich besser als das, was ich oben habe.

Antwort

Gibt es in SQL überhaupt eine Möglichkeit, den sich wiederholenden Code zu entfernen?

Nicht wirklich, nein. Sie können die Abfrage ohne die IF-Anweisung wie folgt umformulieren, aber sie unterscheidet sich nicht wirklich von dem, was Sie haben:

SELECT * FROM dbo.OrdersImport o WHERE LEFT(OrderNumber, 3) <> "ABC" AND EXISTS ( SELECT * FROM dbo.OrdersImport WHERE LEFT(OrderNumber,3) <> "ABC" AND ID = o.ID ) 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.