Bedingte Auswahlabfrage

Ich habe eine große SQL-Abfrage mit mehreren statementen und UNION ALL . Ich mache jetzt so etwas:

 DECLARE @condition BIT; SET @condition = 0; SELECT * FROM table1 WHERE @condition = 1; UNION ALL SELECT * FROM table2 

In diesem Fall gibt table1 keine Ergebnisse zurück. Allerdings ist diese Abfrage komplex mit vielen Joins (wie FullTextTable ). Die Schätzung des Ausführungsplans zeigt eine hohe Kosten, aber die tatsächliche Anzahl der Zeilen und die time zum Ausführen scheint anders zu zeigen. Ist das der effizienteste path, eine ganze Abfrage zu filtern, oder gibt es einen besseren path? Ich möchte nicht, dass irgendetwas in der ersten Auswahl läuft, wenn möglich.

Der beste path, dies zu lösen, ist die Verwendung von Dynamic SQL. Das Problem mit den Lösungen von DForck besteht darin, dass es zu Parametern schnüffeln kann. Nur um eine grobe Vorstellung zu geben, könnte deine Frage so aussehen

DECLARE @query VARCHAR (MAX);

IF (@ condition = 0) SET @query = 'SELECT * FROM Tabelle1 UNION ALL'

SET @query = @query + 'SELECT * FROM table2'

sp_executesql @query

Dies ist nur ein vereinfachter Fall, aber bei der eigentlichen Implementierung würden Sie die dynamische Abfrage parametrieren, die das Problem des Parameters Schnüffeln lösen wird. Hier ist eine hervorragende Erklärung zu diesem Problem Parameter Sniffing (oder Spoofing) in SQL server

Ich würde mir vorstellen, dass Ihre eventuelle SQL-Abfrage mit allen Gewerkschaften und Bedingungen, die von vorberechneten Werten abhängen, ziemlich kompliziert wird. Wenn Sie daran interessiert sind, die Komplexität der Abfrage zu reduzieren (nicht auf die Maschine, sondern um Wartungszwecke), würde ich mit einer Verschiebung der einzelnen Abfragen in viewen oder Tabellenwertfunktionen gehen, um diese Logik anderswo zu verschieben. Dann können Sie die if @condition = 1 Syntax verwenden, die an anderer Stelle vorgeschlagen wurde.

Ich denke, du könntest damit besser sein:

 if (@condition=1) begin select * from table1 union all select * from table2 end else begin select * from table2 end