SQL सर्वर का उपयोग करके संग्रहीत कार्यविधि में डायनेमिक SQL कमांड को निष्पादित करने के वास्तविक दुनिया के नियम और विपक्ष क्या हैं
EXEC (@SQL)
बनाम
EXEC SP_EXECUTESQL @SQL
?
जवाबों:
sp_executesql
क्वेरी योजना के पुन: उपयोग को बढ़ावा देने की अधिक संभावना है। उपयोग करते समय sp_executesql
, कॉलिंग हस्ताक्षर में मापदंडों को स्पष्ट रूप से पहचाना जाता है। यह उत्कृष्ट लेख इस प्रक्रिया को बताता है ।
डायनामिक sql के कई पहलुओं के लिए thet उद्धृत संदर्भ Erland Sommarskog का अवश्य पढ़ा जाना चाहिए: " गतिशील SQL का अभिशाप और आशीर्वाद "।
SP_EXECUTESQL के बारे में बड़ी बात यह है कि यह आपको पैरामीटरयुक्त प्रश्न बनाने की अनुमति देता है जो SQL इंजेक्शन के बारे में परवाह है तो बहुत अच्छा है।
Microsoft का उपयोग sp_executesql आलेख कथन के sp_executesql
बजाय का उपयोग करने की अनुशंसा करता है execute
।
क्योंकि यह संग्रहीत कार्यविधि पैरामीटर प्रतिस्थापन का समर्थन करती है , इसलिए sp_executesql EXECUTE से अधिक बहुमुखी है; और क्योंकि sp_executesql SQL सर्वर द्वारा पुन: उपयोग किए जाने की अधिक संभावना वाले निष्पादन योजनाएं बनाता है, तो sp_executesql EXECUTE की तुलना में अधिक कुशल है।
तो, दूर ले: बयान का उपयोग न करेंexecute
। का उपयोग करें sp_executesql
।
sp_executesql
उपयोग करने के लिए उपयोग नहीं किया जा सकता है execute
। शायद मुझे उस बिंदु को रखना चाहिए जिस पर मैं जोर देने की कोशिश कर रहा हूं: जब भी संभव हो,sp_executesql
इसके बजाय का उपयोग करें । execute
मैं हमेशा इन दिनों sp_executesql का उपयोग करता हूं, यह वास्तव में EXEC के लिए एक आवरण है जो मापदंडों और चर को संभालता है।
हालांकि बहुत बड़े डेटाबेस पर प्रश्नों को ट्यून करते समय OPTION RECOMPILE के बारे में मत भूलना, विशेष रूप से जहां आपके पास एक से अधिक डेटाबेस पर डेटा स्पेंड किया गया है और इंडेक्स स्कैन को सीमित करने के लिए एक CONSTRAINT का उपयोग कर रहे हैं।
जब तक आप विकल्प युक्ति का उपयोग करते हैं, तब तक SQL सर्वर आपकी क्वेरी के लिए "एक आकार सभी फिट बैठता है" निष्पादन योजना बनाने का प्रयास करेगा, और प्रत्येक बार चलने पर एक पूर्ण अनुक्रमणिका स्कैन चलाएगा।
यह एक खोज की तुलना में बहुत कम कुशल है, और इसका मतलब है कि यह संभावित रूप से पूरे सूचकांक को स्कैन कर रहा है जो कि सीमाओं के लिए विवश हैं जिन्हें आप क्वेरी भी नहीं कर रहे हैं: @
आज्ञा का पालन करें
declare @sql varchar (100)
set @sql ='select * from #td1'
if (@IsMonday+@IsTuesday !='')
begin
set @sql= @sql+' where PickupDay in ('''+@IsMonday+''','''+@IsTuesday+''' )'
end
exec( @sql)
int
गतिशील SQL में नहीं हो सकता । ध्यान दें कि @sql के रूप में घोषित किया जाता है varchar
याnvarchar