कोशिश करें:
;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 [email protected])
AND (@search2 IS NULL or [email protected])
AND (@search3 IS NULL or [email protected])
और इसे रन टाइम पर ऑप्टिमाइज़ करें (बशर्ते कि केवल @Search2 को मान के साथ पास किया गया हो):
WHERE
[email protected]
और एक इंडेक्स का उपयोग किया जा सकता है (यदि आपके पास कॉलम 2 पर परिभाषित है)