thử:
;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
)
chìa khóa với điều kiện tìm kiếm động là đảm bảo một chỉ mục được sử dụng, Dưới đây là một bài viết rất toàn diện về cách xử lý chủ đề này:
Điều kiện tìm kiếm động trong T-SQL của Erland Sommarskog
nó bao gồm tất cả các vấn đề và phương pháp cố gắng viết truy vấn với nhiều điều kiện tìm kiếm tùy chọn. Điều chính bạn cần quan tâm không phải là sự trùng lặp mã, mà là việc sử dụng một chỉ mục. Nếu truy vấn của bạn không thể sử dụng một chỉ mục, nó sẽ hoạt động kém. Có một số kỹ thuật có thể được sử dụng, có thể có hoặc không cho phép sử dụng một chỉ mục.
đây là mục lục:
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
nếu bạn đang sử dụng phiên bản SQL Server 2008 thích hợp, có một kỹ thuật bổ sung có thể được sử dụng, hãy xem: Điều kiện Tìm kiếm Động trong Phiên bản T-SQL cho SQL 2008 (SP1 CU5 trở lên)
Nếu bạn đang sử dụng phiên bản SQL Server 2008 thích hợp đó, bạn chỉ có thể thêm OPTION (RECOMPILE)
cho truy vấn và giá trị của biến cục bộ tại thời điểm chạy được sử dụng để tối ưu hóa.
Hãy xem xét điều này, OPTION (RECOMPILE)
sẽ lấy mã này (nơi không thể sử dụng chỉ mục nào với mớ OR
này s):
WHERE
(@search1 IS NULL or [email protected])
AND (@search2 IS NULL or [email protected])
AND (@search3 IS NULL or [email protected])
và tối ưu hóa nó tại thời điểm chạy (miễn là chỉ @ Search2 được chuyển vào với một giá trị):
WHERE
[email protected]
và một chỉ mục có thể được sử dụng (nếu bạn có một chỉ mục được xác định trên Cột 2)