Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

ако е в рамките на CTE?

опитайте:

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

ключът при условието за динамично търсене е да се уверите, че се използва индекс. Ето една много изчерпателна статия за това как да се справите с тази тема:

Условия за динамично търсене в T-SQL от Erland Sommarskog

той обхваща всички проблеми и методи за опити за писане на заявки с множество незадължителни условия за търсене. Това основно нещо, с което трябва да се интересувате, не е дублирането на код, а използването на индекс. Ако вашата заявка не успее да използва индекс, тя ще се формира лошо. Има няколко техники, които могат да се използват, които могат или не могат да позволят използването на индекс.

ето съдържанието:

  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

ако използвате правилната версия на SQL Server 2008, има допълнителна техника, която може да се използва, вижте:Условия за динамично търсене във версия на T-SQL за SQL 2008 (SP1 CU5 и по-нови)

Ако използвате правилната версия на SQL Server 2008, можете просто да добавите OPTION (RECOMPILE) към заявката и стойността на локалната променлива по време на изпълнение се използва за оптимизациите.

Помислете за това, OPTION (RECOMPILE) ще вземе този код (където не може да се използва индекс с тази бъркотия от OR s):

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

и го оптимизирайте по време на изпълнение да бъде (при условие, че само @Search2 е предадено със стойност):

WHERE
    [email protected]

и може да се използва индекс (ако имате дефиниран такъв в Колона2)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използвайте IDENT_CURRENT() за връщане на текущата стойност на самоличността в колона за самоличност в SQL Server

  2. Сума на подзаявки на SQL Server

  3. Използване на PATINDEX за намиране на модели с различна дължина в T-SQL

  4. Грешка при потвърждение на ръкостискане преди влизане в SQL Server

  5. острови и пропуски tsql