2009-02-13 18 views
79

बनामगतिशील एसक्यूएल - EXEC (@SQL) बनाम EXEC sp_executesql (@SQL)

असली दुनिया पेशेवरों और SQL सर्वर में एक संग्रहीत प्रक्रिया में एक गतिशील एसक्यूएल आदेश को क्रियान्वित करने के विपक्ष

EXEC (@SQL) 

का उपयोग कर रहे हैं

EXEC SP_EXECUTESQL @SQL 

?

उत्तर

82

sp_executesql क्वेरी प्लान पुन: उपयोग को बढ़ावा देने की अधिक संभावना है। sp_executesql का उपयोग करते समय, कॉलम हस्ताक्षर में पैरामीटर स्पष्ट रूप से पहचाने जाते हैं। यह उत्कृष्ट लेख इस process descibes।

गतिशील एसक्यूएल के कई पहलुओं के लिए उल्लिखित संदर्भ Erland Sommarskog को पढ़ना चाहिए: "The Curse and Blessings of Dynamic SQL"।

18

SP_EXECUTESQL के बारे में बड़ी बात यह है कि यह आपको पैरामीटरयुक्त क्वेरी बनाने की अनुमति देता है जो कि यदि आप SQL इंजेक्शन की परवाह करते हैं तो बहुत अच्छा है।

+1

मुझे नहीं लगता कि आप इसे बिना एक गतिशील एसक्यूएल parameteize कर सकते हैं ?? –

+0

EXEC ('चयन करें * जहां से आईडी =?', 123) पैरामीटर प्लेसहोल्डर को प्रतिस्थापित करेगा "?"मूल्य 123 के साथ और फिर क्वेरी निष्पादित करें, चयन के लिए परिणाम लौटाएं * जहां से आईडी = 123 –

+1

ओह, यह वाक्यविन्यास केवल लिंक किए गए सर्वर के लिए उपलब्ध है। –

-4
  1. (एसपी पैरामीटर यहाँ @IsMonday और @IsTuesday कर रहे हैं) घोषित अपने आदेश द्वारा चर
  2. सेट यह और इस तरह एसपी के उपयोग पैरामीटर मान गतिशील भागों को जोड़ने
  3. निष्पादित आदेश

    declare @sql varchar (100) 
    set @sql ='select * from #td1' 
    
    if (@[email protected] !='') 
    begin 
    set @sql= @sql+' where PickupDay in ('''[email protected]+''','''[email protected]+''')' 
    end 
    exec(@sql) 
    
+14

यह एसक्यूएल इंजेक्शन के लिए खुला है, अगर आप "ए" डालते हैं; ड्रॉप डाटाबेस DATABASE_NAME; जाओ; '; "@IsMonday चर –

3

माइक्रोसॉफ्ट के Using sp_executesql आलेख execute कथन के बजाय sp_executesql का उपयोग करने की अनुशंसा करता है।

इस संग्रहीत प्रक्रिया पैरामीटर प्रतिस्थापन समर्थन करता है, sp_executesql निष्पादन की तुलना में अधिक बहुमुखी है, और क्योंकि sp_executesql निष्पादन योजनाएं उत्पन्न करता है जो SQL सर्वर द्वारा पुन: उपयोग किए जाने की अधिक संभावना है, sp_executesql EXECUTE से अधिक कुशल है।

तो, दूर ले: execute बयान प्रयोग न करें। sp_executesql का प्रयोग करें।

+5

में आपका टेकवे हमेशा खड़ा नहीं होता है। ऐसे अवसर होते हैं जब sp_executesql का उपयोग करके कोई दक्षता बोनस नहीं होता है, लेकिन आप अपने कोड को एसक्यूएल इंजेक्शन हमले से सुरक्षित कर सकते हैं। कभी-कभी आप sp_executesql का उपयोग नहीं कर सकते जिस तरह से आप निष्पादन का उपयोग कर सकते हैं, तो ... किसी ने कहा - कोई चांदी की बुलेट नहीं है। मैं सहमत हूं। – OzrenTkalcecKrznaric

+0

हां, माइक्रोसॉफ्ट को इसे "अधिक * संभावित * कुशल होने के रूप में रखना चाहिए" और कुछ वर्षों तक उद्योग में होना चाहिए , मैंने ऐसे मामलों को देखा है जहां 'exec_'' को निष्पादित करने के लिए 'sp_executesql' का उपयोग नहीं किया जा सकता है। शायद मुझे उस बिंदु को रखना चाहिए जो मैं तनाव के लिए प्रयास कर रहा हूं:' execute' * के बजाय 'sp_executesql' का उपयोग करें * जब भी संभव हो। * – Gan

2

मैं हमेशा इन दिनों sp_executesql का उपयोग करता हूं, यह वास्तव में EXEC के लिए एक रैपर है जो पैरामीटर & चर को संभालता है।

हालांकि बहुत बड़े डेटाबेस पर प्रश्नों को ट्यून करते समय विकल्प रिकॉम्पिल के बारे में मत भूलना, विशेष रूप से जहां आपके पास एक से अधिक डेटाबेस पर डेटा फैला हुआ है और इंडेक्स स्कैन को सीमित करने के लिए कंसस्ट्रेंट का उपयोग कर रहे हैं।

जब तक आप विकल्प रिकॉम्पिल का उपयोग नहीं करते हैं, तो SQL सर्वर आपकी क्वेरी के लिए "एक आकार सभी फिट बैठता है" निष्पादन योजना बनाने का प्रयास करेगा, और प्रत्येक बार चलाए जाने पर एक पूर्ण अनुक्रमणिका स्कैन चलाएगा।

यह बहुत कम एक की तलाश की तुलना में कुशल है, और यह संभवतः पूरे अनुक्रमित जो श्रेणियों के लिए विवश कर रहे हैं जो आप भी क्वेरी करने नहीं कर रहे हैं स्कैनिंग है मतलब है: @

संबंधित मुद्दे