sql >> Base de Datos >  >> RDS >> Sqlserver

si no dentro del CTE?

prueba:

;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 clave con una condición de búsqueda dinámica es asegurarse de que se use un índice. Aquí hay un artículo muy completo sobre cómo manejar este tema:

Condiciones de búsqueda dinámica en T-SQL por Erland Sommarskog

cubre todos los problemas y métodos para intentar escribir consultas con múltiples condiciones de búsqueda opcionales. Lo principal que debe preocuparte no es la duplicación de código, sino el uso de un índice. Si su consulta no puede usar un índice, tendrá un desempeño deficiente. Hay varias técnicas que se pueden utilizar, que pueden o no permitir el uso de un índice.

aquí está la tabla de contenido:

  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

si tiene la versión correcta de SQL Server 2008, hay una técnica adicional que se puede usar, consulte:Condiciones de búsqueda dinámica en la versión de T-SQL para SQL 2008 (SP1 CU5 y posteriores)

Si está en esa versión adecuada de SQL Server 2008, simplemente puede agregar OPTION (RECOMPILE) a la consulta y el valor de la variable local en tiempo de ejecución se utiliza para las optimizaciones.

Considere esto, OPTION (RECOMPILE) tomará este código (donde no se puede usar ningún índice con este lío de OR s):

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

y optimizarlo en tiempo de ejecución para que sea (siempre que solo se haya pasado @Search2 con un valor):

WHERE
    [email protected]

y se puede usar un índice (si tiene uno definido en Column2)