Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

se altro all'interno di CTE?

prova:

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

la chiave con una condizione di ricerca dinamica è assicurarsi che venga utilizzato un indice. Ecco un articolo molto completo su come gestire questo argomento:

Condizioni di ricerca dinamica in T-SQL di Erland Sommarskog

copre tutti i problemi e i metodi per provare a scrivere query con più condizioni di ricerca opzionali. Questa cosa principale di cui devi preoccuparti non è la duplicazione del codice, ma l'uso di un indice. Se la tua query non riesce a utilizzare un indice, funzionerà male. Esistono diverse tecniche che possono essere utilizzate, che possono consentire o meno di utilizzare un indice.

ecco il sommario:

  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

se si utilizza la versione corretta di SQL Server 2008, è possibile utilizzare una tecnica aggiuntiva, vedere:Condizioni di ricerca dinamica nella versione T-SQL per SQL 2008 (SP1 CU5 e versioni successive)

Se utilizzi quella versione corretta di SQL Server 2008, puoi semplicemente aggiungere OPTION (RECOMPILE) alla query e il valore della variabile locale in fase di esecuzione viene utilizzato per le ottimizzazioni.

Considera questo, OPTION (RECOMPILE) prenderà questo codice (dove nessun indice può essere utilizzato con questo pasticcio di OR s):

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

e ottimizzarlo in fase di esecuzione (a condizione che solo @Search2 sia stato passato con un valore):

WHERE
    [email protected]

e un indice può essere utilizzato (se ne hai uno definito su Column2)