wenn sonst in CTE?

8

Ich möchte eine Select-Anweisung innerhalb des CTE basierend auf einer Kodierung ausführen. etwas wie unten

%Vor%

Aber ich bekomme einen Fehler dabei. Ist es möglich, wenn anders in CTEs? Wenn nicht, gibt es eine Arbeit oder einen besseren Ansatz.

Danke.

    
stackoverflowuser 25.05.2010, 18:22
quelle

4 Antworten

20

versuchen:

%Vor%

Der Schlüssel mit einer dynamischen Suchbedingung ist, um sicherzustellen, dass ein Index verwendet wird. Hier ist ein sehr ausführlicher Artikel, wie man mit diesem Thema umgeht:

Dynamische Suchbedingungen in T-SQL von Erland Sommarskog

Es behandelt alle Probleme und Methoden, um Abfragen mit mehreren optionalen Suchbedingungen zu schreiben. Diese Hauptsache, mit der Sie sich befassen müssen, ist nicht die Duplizierung von Code, sondern die Verwendung eines Index. Wenn Ihre Abfrage keinen Index verwendet, wird sie schlecht vorformatiert. Es gibt mehrere Techniken, die verwendet werden können, die möglicherweise einen Index verwenden können oder nicht.

Hier ist das Inhaltsverzeichnis:

%Vor%

Wenn Sie die richtige Version von SQL Server 2008 verwenden, gibt es eine zusätzliche Technik, die verwendet werden kann, siehe: Dynamische Suchbedingungen in T-SQL-Version für SQL 2008 (SP1 CU5 und höher)

Wenn Sie die richtige Version von SQL Server 2008 verwenden, können Sie einfach OPTION (RECOMPILE) zur Abfrage hinzufügen, und der Wert der lokalen Variablen zur Laufzeit wird für die Optimierungen verwendet.

Beachten Sie, dass OPTION (RECOMPILE) diesen Code verwenden wird (wo kein Index mit diesem Chaos von OR s verwendet werden kann):

%Vor%

und optimieren Sie es zur Laufzeit (vorausgesetzt, dass nur @ Search2 mit einem Wert übergeben wurde):

%Vor%

und ein Index kann verwendet werden (wenn Sie einen für Column2 definiert haben)

    
KM. 25.05.2010, 18:24
quelle
3

Versuchen Sie niemals, Bedingungen wie IF in eine einzige Abfrageanweisung zu stellen. Selbst wenn Sie es schaffen, es zu schaffen, ist dies der eine sichere Weg, Leistung zu töten. Denken Sie daran, dass eine einzelne Anweisung einen einzelnen Plan bedeutet und der Plan so generiert werden muss, dass beide Fälle erfüllt werden, wenn die Bedingung wahr ist und wenn die Bedingung falsch ist, sofort . Dies führt normalerweise zu einem schlechteren Plan, da die 'Bedingung' normalerweise einen sich gegenseitig ausschließenden Zugriffspfad für den Plan erzeugt und die Vereinigung der beiden Ergebnisse immer zu einer End-to-End-Tabellenabtastung führt.

Aus diesem und vielen anderen Gründen ist es Ihre beste Vorgehensweise, die IF außerhalb der Aussage zu ziehen:

%Vor%     
Remus Rusanu 25.05.2010 18:27
quelle
1

Ich denke, der IF ELSE-Kram könnte ein schlechtes Caching haben, wenn die Verzweigungsbedingung umschlägt. Vielleicht kann jemand, der sachkundiger ist, etwas dazu sagen.

Ein anderer Weg wäre UNION ALL mit den WHERE-Klauseln, wie von anderen vorgeschlagen. Die UNION ALL würde die IF ELSE ersetzen

    
Jason Kleban 25.05.2010 18:29
quelle
0

Wenn Sie einen Parameter verwenden, benötigen Sie nur eine Anweisung.

%Vor%     
ericgu 21.01.2015 21:50
quelle