Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

wenn sonst innerhalb CTE?

versuche:

;with CTE_AorB
(
    select * from table_A WHERE (condition true)
    union all
    select * from table_B WHERE NOT (condition true)
),
CTE_C as
(
   select * from CTE_AorB // processing is removed
)

Der Schlüssel zu einer dynamischen Suchbedingung besteht darin, sicherzustellen, dass ein Index verwendet wird. Hier ist ein sehr umfassender Artikel zum Umgang mit diesem Thema:

Dynamische Suchbedingungen in T-SQL von Erland Sommarskog

Es behandelt alle Probleme und Methoden zum Schreiben von Abfragen mit mehreren optionalen Suchbedingungen. Diese Hauptsache, um die Sie sich kümmern müssen, ist nicht die Duplizierung von Code, sondern die Verwendung eines Index. Wenn Ihre Abfrage keinen Index verwendet, wird sie schlecht ausgeführt. Es gibt mehrere Techniken, die verwendet werden können, die die Verwendung eines Index zulassen oder nicht.

Hier ist das Inhaltsverzeichnis:

  Introduction
      The Case Study: Searching Orders
      The Northgale Database
   Dynamic SQL
      Introduction
      Using sp_executesql
      Using the CLR
      Using EXEC()
      When Caching Is Not Really What You Want
   Static SQL
      Introduction
      x = @x OR @x IS NULL
      Using IF statements
      Umachandar's Bag of Tricks
      Using Temp Tables
      x = @x AND @x IS NOT NULL
      Handling Complex Conditions
   Hybrid Solutions – Using both Static and Dynamic SQL
      Using Views
      Using Inline Table Functions
   Conclusion
   Feedback and Acknowledgements
   Revision History

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

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

Beachten Sie Folgendes, OPTION (RECOMPILE) nimmt diesen Code (wobei kein Index mit diesem Durcheinander von OR verwendet werden kann s):

WHERE
    (@search1 IS NULL or [email protected])
    AND (@search2 IS NULL or [email protected])
    AND (@search3 IS NULL or [email protected])

und zur Laufzeit optimieren (sofern nur @Search2 mit einem Wert übergeben wurde):

WHERE
    [email protected]

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