Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

se mais dentro do CTE?


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

a chave com uma condição de pesquisa dinâmica é garantir que um índice seja usado. Aqui está um artigo muito abrangente sobre como lidar com esse tópico:

Condições de pesquisa dinâmica em T-SQL por Erland Sommarskog

ele cobre todos os problemas e métodos de tentar escrever consultas com várias condições de pesquisa opcionais. A principal preocupação com a qual você precisa se preocupar não é a duplicação de código, mas o uso de um índice. Se sua consulta não usar um índice, ela terá um desempenho ruim. Existem várias técnicas que podem ser utilizadas, que podem ou não permitir a utilização de um índice.

aqui está o índice:
  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 você estiver na versão correta do SQL Server 2008, há uma técnica adicional que pode ser usada, consulte:Condições de pesquisa dinâmica na versão T-SQL para SQL 2008 (SP1 CU5 e posterior)

Se você estiver na versão adequada do SQL Server 2008, basta adicionar OPTION (RECOMPILE) para a consulta e o valor da variável local em tempo de execução é usado para as otimizações.

Considere isso, OPTION (RECOMPILE) vai pegar este código (onde nenhum índice pode ser usado com esta bagunça de OR s):
WHERE
    (@search1 IS NULL or [email protected])
    AND (@search2 IS NULL or [email protected])
    AND (@search3 IS NULL or [email protected])

e otimizá-lo em tempo de execução (desde que apenas @Search2 tenha sido passado com um valor):
WHERE
    [email protected]

e um índice pode ser usado (se você tiver um definido na Coluna2)