2012-05-16 3 views
21

का उपयोग कर पटकथा एस.पी. से SSMS को रोकने के लिए 2012 मैं जानते हैं कि यह Stop SSMS from scripting SPs using sp_executesql?कैसे sp_executesql

काफ़ी मिलती-जुलती सवाल यह है कि हालांकि, वे SSMS 2012

साथ व्यवहार को बदल दिया है करने के लिए आप 'चेक है, तो लगता है अस्तित्व 'विकल्प के लिए के रूप में, चयनित:

enter image description here

... अब यह उत्पन्न करता है एक IF NOT के बारे में बनाई जाने वाली proc, रूप में अच्छी तरह एक मैं के रूप में के लिए मौजूद है एफ पिछले ड्रॉप proc के लिए मौजूद है, अगर, के रूप में मैं आमतौर पर करते हैं, मैं ड्रॉप का चयन करें और विकल्प बनाने:

enter image description here

यह स्क्रिप्ट के लिए यह बलों sp_executesql का उपयोग कर बनाएँ। यह व्यर्थ है, क्योंकि अगर आपको डीआरओपी ने इसे अभी गिरा दिया है, तो आपको क्रिएट पर जांच की जरूरत नहीं है।

ऐसा लगता है कि एक के बिना एक होना संभव नहीं है।

कोई विचार?

उत्तर

8

आप गतिशील एसक्यूएल के बिना ऐसा नहीं कर सकते क्योंकि एक संग्रहित प्रक्रिया अपने बैच में होनी चाहिए। इसलिए आप यह नहीं कह सकते: रखने के लिए

IF <some condition> 
    <start a new batch> 

एक ही रास्ता एक ही बैच में sp_executesql उपयोग करने के लिए है।

यदि आप DROP और CREATE को एक साथ स्क्रिप्ट करने जा रहे हैं, तो बस ऑब्जेक्ट अस्तित्व की जांच के बिना इसे करें। यह आपको दे देंगे:

DROP PROCEDURE ...; 
GO 
CREATE PROCEDURE ...; 
GO 

कौन परवाह करता है अगर DROP विफल रहता है? (यह है, क्योंकि आप बस इसे से पटकथा नहीं करना चाहिए!)

यदि आप किसी अन्य प्रणाली है कि पराक्रम वस्तु है के लिए इस स्क्रिप्ट रहे हैं, तो आप DROP के लिए एक त्रुटि संदेश जब यह नहीं है मिल जाएगा , लेकिन CREATE अभी भी होगा, इसलिए आप DROP त्रुटियों को अनदेखा कर सकते हैं। यदि आप वास्तव में चाहते हैं कि TRY/CATCH में DROP कथन मैन्युअल रूप से लपेटें लेकिन मुझे नहीं लगता कि यह आवश्यक है।

यदि आपको कई प्रक्रियाओं के लिए ऐसा करने की ज़रूरत है, या यदि आपको वास्तव में सौम्य त्रुटियों को उत्पन्न करने की प्रक्रिया की आवश्यकता नहीं है, तो मेरा सुझाव है कि आप प्रबंधन स्टूडियो के आदिम स्क्रिप्टिंग विकल्पों को छोड़ दें और इसके लिए एक तृतीय पक्ष टूल का उपयोग करें। वे पहले से ही उन कई मुद्दों से निपटा चुके हैं जिन्हें आपने अभी तक नहीं पार किया है, लेकिन करेंगे। मैं इस बारे में भी ब्लॉग:

http://bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/

+0

इसके लिए धन्यवाद - मुझे बहुत संदेह है। मैं वास्तव में जो चाहता हूं वह दोनों EXFSTS के लिए एक विकल्प है, और यदि नहीं है तो EXISTS। मैं अब के लिए डीआरओपी त्रुटि को अनदेखा कर सकता हूं, लेकिन इन स्क्रिप्ट को स्वचालित प्रक्रिया द्वारा चलाया जा सकता है, और किसी बिंदु पर मुझे त्रुटियों की जांच के लिए स्क्रिप्ट लॉग को पार्स करने की आवश्यकता होगी। ऐसा लगता है कि उन्होंने इस बदलाव के साथ अपने प्रतिकृति कदमों में से एक बना दिया है। – ChrisA

+0

उन्होंने शब्द को अद्यतन किया (जो आंशिक रूप से मेरी गलती हो सकती है)। Http://connect.microsoft.com/SQLServer/feedback/details/624075/include-if-not-exists-clause-impacts-drop-scripting http://connect.microsoft.com/SQLServer/feedback/details/ देखें 24279 9/एसएसएमएस-निश्चित-स्क्रिप्टिंग-विकल्प-उपज-गतिशील-एसक्यूएल और https://connect.microsoft.com/SQLServer/feedback/details/242795/ssms-certain-scripting- विकल्प-do-not-work-for- –

+3

संशोधित करें हाँ, मुझे शब्द के बारे में परेशान नहीं है। यह तथ्य यह है कि अगर मैं IF EXISTS (DROP त्रुटि को रोकने के लिए) चाहता हूं, तो मुझे भी बनाने के लिए मजबूर होना पड़ता है अगर मैं निर्माण पर EXISSTS नहीं करता हूं, जो बदले में sp_executesql के लिए तर्क बनने के लिए मजबूर करता है, जिसे मैं भी करता हूं नहीं चाहते - क्योंकि किसी भी अनजान टाइपो स्पष्ट त्रुटियों को उत्पन्न नहीं करेगा। यह ठीक था - अगर एक्सफिस्ट्स डिफ़ॉल्ट रूप से वहां थे, और मेरे पास नहीं था अगर EXISTS स्विच नहीं किया गया था। * नहीं * अगर IFIS एक अलग विकल्प है, तो मेरे लिए यह अब SQL08 से भी बदतर है। – ChrisA

5

निकटतम आप इस कार्यक्षमता को प्राप्त कर सकते हैं उपकरण, विकल्प, एसक्यूएल सर्वर ऑब्जेक्ट एक्सप्लोरर, पटकथा के तहत जाना है, तो ऑब्जेक्ट गलत पर मौजूदा के लिए चेक की स्थापना की।

दोष यह है कि यदि आप ऐसा करते हैं तो बूंदों और रचनाएं हमेशा ड्रॉप करने की कोशिश करती हैं भले ही ऑब्जेक्ट मौजूद न हो। आदर्श समाधान एक सेटिंग होगी जो आपकी स्क्रिप्ट को दृश्य, प्रक्रियाओं और उपयोगकर्ता-परिभाषित कार्यों को बनाने के लिए नीचे दिए गए उदाहरण की तरह दिखने की अनुमति देगी।

/****** Object: View [dbo].[vEmployees] Script Date: 9/14/2012 9:18:57 AM ******/ 
IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vEmployees]')) 
DROP VIEW [dbo].[vEmployees] 
GO 

CREATE VIEW [dbo].[vEmployees] 
AS 
    SELECT DISTINCT 
     Employees.EmployeeID, 
     FirstName, 
     LastName 
    from 
     Employees 
      JOIN Sales on Employees.EmployeeID=Sales.EmployeeID 
GO 

संक्षेप में स्क्रिप्टिंग इंजन ड्रॉप के बारे में सोचती है और वस्तु के लिए जाँच यह अस्तित्व बनाने पर शर्त लगाने के लिए की जरूरत नहीं है में एक साथ बनाते हैं।

0

मैंने भी एक ही मुद्दे से संघर्ष किया। यदि आपको पूरे डेटाबेस के लिए ऑब्जेक्ट्स को स्क्रिप्ट करने की आवश्यकता है, तो आप ApexSQL स्क्रिप्ट पर विचार करना चाहेंगे। मैंने कई औजारों की कोशिश की और एपेक्सएसक्यूएल ने ऑब्जेक्ट्स को स्क्रिप्ट किया जो मुझे चाहिए। (यदि ऑब्जेक्ट मौजूद है, तो ड्रॉप करें। ऑब्जेक्ट बनाएं)। मेरा मानना ​​है कि यह कमांड लाइन से भी काम करता है। नोट, यह शेयरवेयर है; मैंने केवल मूल्यांकन संस्करण का उपयोग किया है क्योंकि मुझे केवल कुछ हद तक इसकी आवश्यकता है।

नीचे कुछ कॉन्फ़िगरेशन के बाद प्रक्रिया के आउटपुट का एक उदाहरण है।

IF (EXISTS(SELECT * FROM sys.objects WHERE [object_id] = OBJECT_ID(N'[dbo].[myProcedure]') AND [type]='P')) 
DROP PROCEDURE [dbo].[myProcedure] 
GO 

SET ANSI_NULLS ON 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE dbo.myProcedure 
AS 
    select 1 as a 
GO 
1

मुझे इस समस्या का एक अच्छा समाधान मिला। आपको स्क्रिप्टिंग करते समय "दो पास" बनाना होगा। पहले पास के दौरान, अस्तित्व की जांच करने के लिए विकल्पों और केवल डीआरओपी स्क्रिप्ट के लिए विकल्पों का चयन करें। फिर, दूसरे पास पर, अस्तित्व की जांच के लिए विकल्प का चयन रद्द करें और CREATE स्क्रिप्ट का चयन करें। इसके अलावा, फ़ाइल में संलग्न विकल्प का उपयोग करें। फिर दूसरी पास पर जेनरेट स्क्रिप्ट चलाने पर, "ओवरराइट फ़ाइल" के विकल्प को अनचेक करें। यह केवल तभी काम करेगा यदि आप प्रत्येक ऑब्जेक्ट के लिए एक अलग फ़ाइल उत्पन्न कर रहे हैं।

0

अंत में लेख के बहुत खोजने के बाद मैं समाधान है कि

आप "दो गुजरता" जब scripting करना चाहिए पाया। पहले पास,

  • दौरान विकल्पों का चयन अस्तित्व के लिए और केवल ड्रॉप स्क्रिप्ट के लिए जाँच करें करने के लिए।
  • फिर, पर दूसरा पास, de-select अस्तित्व की जांच के लिए विकल्प और CREATE स्क्रिप्ट का चयन करें।
    • इसके अतिरिक्त, Append To File विकल्प का उपयोग करें। फिर पर दूसरी उत्पन्न पर जनरेट स्क्रिप्ट चलाने पर, "Overwrite File" के विकल्प को अनचेक करें। यह केवल तभी काम करेगा यदि आप प्रत्येक ऑब्जेक्ट के लिए एक अलग फ़ाइल उत्पन्न कर रहे हैं।
+0

यह पिछले उत्तर के समान है – Pedro

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