आप डायनामिक एसक्यूएल के बिना ऐसा नहीं कर सकते क्योंकि एक संग्रहित प्रक्रिया को अपने बैच में होना चाहिए। इसलिए आप यह नहीं कह सकते:
IF <some condition>
<start a new batch>
इसे उसी बैच में रखने का एकमात्र तरीका sp_executesql . का उपयोग करना है ।
यदि आप DROP script को स्क्रिप्ट करने जा रहे हैं और CREATE एक साथ, वस्तु अस्तित्व की जांच के बिना इसे करें। यह आपको देगा:
DROP PROCEDURE ...;
GO
CREATE PROCEDURE ...;
GO
कौन परवाह करता है अगर DROP विफल? (ऐसा नहीं होना चाहिए, क्योंकि आपने अभी-अभी इसकी पटकथा लिखी है!)
अगर आप इसे किसी अन्य सिस्टम के लिए स्क्रिप्ट कर रहे हैं जो हो सकता है ऑब्जेक्ट है, आपको DROP . के लिए एक त्रुटि संदेश मिलेगा जब ऐसा नहीं होता है, लेकिन CREATE अभी भी होगा, इसलिए आप DROP को नज़रअंदाज़ कर सकते हैं त्रुटियाँ। यदि आप वास्तव में चाहते हैं तो आप DROP . को मैन्युअल रूप से लपेट सकते हैं TRY/CATCH में स्टेटमेंट लेकिन मुझे नहीं लगता कि यह आवश्यक है।
यदि आपको बहुत सारी प्रक्रियाओं के लिए ऐसा करने की आवश्यकता है, या यदि आपको वास्तव में सौम्य त्रुटियों को उत्पन्न करने की प्रक्रिया की आवश्यकता नहीं है, तो मेरा सुझाव है कि आप प्रबंधन स्टूडियो के आदिम स्क्रिप्टिंग विकल्पों को छोड़ दें और इसके लिए किसी तृतीय पक्ष टूल का उपयोग करें। वे पहले से ही ऐसे कई मुद्दों से निपट चुके होंगे जिन्हें आपने अभी तक नहीं देखा है, लेकिन करेंगे। मैंने इस बारे में ब्लॉग किया:
https:// bertandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/