कोशिश करें:
;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
)
एक गतिशील खोज स्थिति के साथ कुंजी यह सुनिश्चित करना है कि एक अनुक्रमणिका का उपयोग किया जाता है, यहां इस विषय को संभालने के तरीके पर एक बहुत व्यापक लेख दिया गया है:
एरलैंड सोमरस्कोग द्वारा टी-एसक्यूएल में गतिशील खोज स्थितियां
इसमें कई वैकल्पिक खोज स्थितियों के साथ प्रश्न लिखने की कोशिश करने के सभी मुद्दों और विधियों को शामिल किया गया है। यह मुख्य बात जिस पर आपको ध्यान देने की आवश्यकता है वह कोड का दोहराव नहीं है, बल्कि एक इंडेक्स का उपयोग है। यदि आपकी क्वेरी किसी अनुक्रमणिका का उपयोग करने में विफल रहती है, तो यह खराब प्रदर्शन करेगी। ऐसी कई तकनीकें हैं जिनका उपयोग किया जा सकता है, जो किसी अनुक्रमणिका के उपयोग की अनुमति दे भी सकती हैं और नहीं भी।
यहाँ सामग्री की तालिका है:
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 के उचित संस्करण पर हैं, तो एक अतिरिक्त तकनीक है जिसका उपयोग किया जा सकता है, देखें:SQL 2008 (SP1 CU5 और बाद के संस्करण) के लिए T-SQL संस्करण में गतिशील खोज स्थितियां
यदि आप SQL Server 2008 की उस उचित रिलीज़ पर हैं, तो आप बस OPTION (RECOMPILE) जोड़ सकते हैं क्वेरी के लिए और रन टाइम पर स्थानीय चर के मान का उपयोग अनुकूलन के लिए किया जाता है।
इस पर विचार करें, OPTION (RECOMPILE) इस कोड को लेगा (जहां OR . की इस गड़बड़ी के साथ किसी अनुक्रमणिका का उपयोग नहीं किया जा सकता है रों):
WHERE
(@search1 IS NULL or example@sqldat.com)
AND (@search2 IS NULL or example@sqldat.com)
AND (@search3 IS NULL or example@sqldat.com)
और इसे रन टाइम पर ऑप्टिमाइज़ करें (बशर्ते कि केवल @Search2 को मान के साथ पास किया गया हो):
WHERE
example@sqldat.com
और एक इंडेक्स का उपयोग किया जा सकता है (यदि आपके पास कॉलम 2 पर परिभाषित है)