sql >> Databasteknik >  >> RDS >> Sqlserver

om annat inom CTE?

försök:

;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
)

nyckeln med ett dynamiskt sökvillkor är att se till att ett index används. Här är en mycket omfattande artikel om hur man hanterar detta ämne:

Dynamiska sökvillkor i T-SQL av Erland Sommarskog

den täcker alla problem och metoder för att försöka skriva frågor med flera valfria sökvillkor. Det här viktigaste du behöver tänka på är inte dupliceringen av kod, utan användningen av ett index. Om din fråga misslyckas med att använda ett index, kommer den att fungera dåligt. Det finns flera tekniker som kan användas, som kan eller inte tillåter att ett index används.

här är innehållsförteckningen:

  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

om du har rätt version av SQL Server 2008 finns det ytterligare en teknik som kan användas, se:Dynamiska sökvillkor i T-SQL-version för SQL 2008 (SP1 CU5 och senare)

Om du använder den rätta versionen av SQL Server 2008 kan du bara lägga till OPTION (RECOMPILE) till frågan och den lokala variabelns värde vid körning används för optimeringarna.

Tänk på detta, OPTION (RECOMPILE) kommer att ta den här koden (där inget index kan användas med denna röra av OR s):

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

och optimera det vid körning (förutsatt att endast @Search2 skickades in med ett värde):

WHERE
    [email protected]

och ett index kan användas (om du har ett definierat på kolumn2)



  1. Vad ska den konverterade datatypen för motsvarande kolumn i Data Converter SSIS Data Flow Component vara?

  2. PHP Apache kraschar när en LAGRAD PROCEDUR körs

  3. TO_SECONDS() Exempel – MySQL

  4. Kodtäckning för PL/SQL