2012-06-27 14 views
16

Ich möchte SQL Server oder KurzschlussOR Operator Kurzschluss in SQL Server

-Code konsultieren:

DECLARE @tempTable table 
     (
     id int 
    ) 
     INSERT @tempTable(id) values(1) 

     DECLARE @id varchar(10) 
     SET @id = 'x' 
     SELECT * FROM @tempTable WHERE 1=1 OR id = @id --successfully 
     SELECT * FROM @tempTable WHERE @id = 'x' OR id = @id --Exception not Convert 'x' to int 

Warum? 1 = 1 und @ id = 'x' ist wahr.

SQL Server OR-Operator: ob die Kurzschlussfunktion

DANK

+5

Es gibt keine Garantie ** ** auch immer, wie und welche Teile eines 'OR' Zustand zuerst ausgewertet werden (oder eine hoch). T-SQL ist ** NOT ** wie C# auf diese Weise. Sie ** können sich nicht auf boolesche Kurzschlüsse verlassen. –

+0

'Warum? 1 = 1 und @ id = 'x' ist wahr '- es ist ** oder ** tatsächlich, nicht ** und **. –

+0

In diesem INSERT @ tempTable (ID) -Werte (1) fehlt INTO. – vijay

Antwort

14

In SQL gibt ist nicht erforderlich,, die eine OR-Klausel früh bricht. Mit anderen Worten ist es für den Optimierer auf, ob simutaneously beiden Bedingungen zu überprüfen. Ich bin kein Experte auf den MSSQL-Optimierer, aber ich habe Fälle gesehen, wo das Optimierungsprogramm hat und kurzes hat keine OR-Klausel geschlossen.

+0

ODER kurzgeschlossen wieder verwenden ist meine Zweifel, aber meine Büro-Code-sql ist ((@ ID ist NULL oder ID = ID) UND (@ Name ist NULL oder Name = @ Name)) so Ich würde gerne wissen, ob der Kurzschluss Weil diese Entscheidung Prozess-Effizienz Um dies zu tun, einfach wieder den Abfrage-Plan – NotTwoWayStreet

5

stolperte über diese Frage, und hatte bereits in diesem Blog-Eintrag gefunden: http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/

Der SQL-Server ist kostenlos, eine Abfrage überall optimieren Gutdünken, so in dem Beispiel in dem Blog-Post gegeben, können Sie nicht auf Kurzschluss angewiesen.

Ein CASE ist jedoch offenbar dokumentiert, um in der schriftlichen Reihenfolge zu bewerten - überprüfen Sie die Kommentare dieses Blogposts.

-1

Es ist aber offensichtlich, dass MS SQL Server Kurzschluss Theorie unterstützt, um die Leistung zu verbessern, indem sie unnötige Kontrolle zu vermeiden,

Unterstützung Beispiel:

SELECT 'TEST' 
WHERE 1 = 'A' 

SELECT 'TEST' 
WHERE 1 = 1 OR 1 = 'A' 

Hier wäre das erste Beispiel in die Irre führen " Fehler bei der Konvertierung, wenn der VARCHAR Wert ‚A‘ in dem Datentyp int umgewandelt wird.‘

Während die zweiten Läufe leicht als Bedingung 1 = 1 bis TRUE ausgewertet und damit die zweite Bedingung lief gar nicht.

Weiteres mehr

SELECT 'TEST' 
WHERE 1 = 0 OR 1 = 'A' 

hier die erste Bedingung zu falsch bewerten würde und damit das DBMS für die zweite Bedingung gehen würde und sie wieder die Fehler der Umwandlung, wie in obigem Beispiel erhalten.

HINWEIS: Ich schrieb der irrigen ZUSTAND NUR WETTER Der Zustand ist EXECUTED oder kurzgeschlossen IF QUERY ERGEBNISSE IN Fehler ist die Bedingung ausgeführt, kurzgeschlossen SONST zu realisieren.

einfache Erklärung

Betrachten

WHERE 1 = 1 OR 2 = 2 

als die erste Bedingung zu TRUE ausgewertet wird immer, sein sinnlosen die zweite Bedingung zu bewerten, da ihre Bewertung in welchem ​​Wert das Ergebnis nicht beeinflussen würde überhaupt, so ist es die gute Gelegenheit für Sql Server, die Ausführungszeit der Abfrage zu sparen, indem unnötige Zustandsprüfungen oder -auswertungen übersprungen werden.

bei „OR“ wenn die erste Bedingung zu TRUE durch verbunden, die gesamte Kette ausgewertet wird „OR“ würde wahr ausgewertet betrachtet, ohne andere zu bewerten.

condition1 OR condition2 OR ..... OR conditionN 

Wenn die Bedingung1 als wahr ausgewertet wird, ruhen Sie alle Bedingungen aus, bis BedingungN übersprungen wird. In verallgemeinerten Worten bei der Bestimmung der ersten TRUE würden alle anderen Bedingungen, die durch ODER verknüpft sind, übersprungen werden.

Betrachten wir die zweite Bedingung

WHERE 1 = 0 AND 1 = 1 

als die erste Bedingung evalutated zu wird immer FALSCH seine sinnlos die zweite Bedingung zu bewerten, da ihre Bewertung in welchem ​​Wert das Ergebnis nicht gar so wieder berühren würde, Es ist eine gute Gelegenheit für Sql Server, die Zeit für die Abfrageausführung zu speichern, indem unnötige Zustandsprüfungen oder -auswertungen übersprungen werden.

bei „AND“ wenn die erste Bedingung, die gesamte Kette mit dem „AND“ verbunden FALSCH ausgewertet würde, ohne die Bewertung anderer auf FALSCH als ausgewertet betrachtet.

condition1 AND condition2 AND ..... conditionN 

wenn die condition1 zu FALSCH ausgewertet wird, ruhen alle Bedingungen bis conditionN würde übersprungen werden. In verallgemeinerten Worten bei der Bestimmung der ersten FALSE würden alle anderen Bedingungen, die durch UND verknüpft sind, übersprungen werden.

DAFüR, A WISE PROGRAMMIER sollte immer die Kette von Bedingungen in einem WEISE Programm, das, billigerer OR MOST Eliminieren CONDITION GETS zuerst ausgewertet, oder den Zustand IN DER WEISE ordnen, dass

maximalen Nutzen OF SHORT CIRCUIT nehmen

Danke und Grüße,

Rk_Hirpara

+3

Downvote Grund: immer Dinge auf einem echten Server zu testen, mit einem vernünftigen Datensatz.Versuchen Sie zum Beispiel, diese realistischere where-Klausel gegen ein Zeichenfeld - wo isnumeric (Feldname) = 1 AND konvertieren (dezimal, Feldname) <= 0 - Sie werden feststellen, dass es einen Konvertierungsfehler in Zeilen leidet, obwohl isnumeric = 0, obwohl es sollte technisch die zweite Bedingung auf solchen Reihen nicht bewerten müssen. – Jasmine