2012-12-13 16 views
19

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

यह क्या मैं हाल ही में कर रहा हूँ है:

use [myDatabase] 
go 

create procedure myProcedure as 
begin 
    print 'placeholder' 
end 
go 

alter procedure myProcedure as 
begin 
    -- real sproc code here 
end 
go 

यह जो मैं चाहता है। यदि प्रक्रिया मौजूद नहीं है, तो इसे सही कोड में परिवर्तित करें। यदि प्रक्रिया मौजूद है, तो निर्माण विफल हो जाता है और नए कोड के साथ कोड को बदलता है।

यह प्रशासकों के लिए एक अलग समस्या पैदा करता है, क्योंकि संग्रह संग्रहीत प्रक्रिया पहले से मौजूद है, तो एक भ्रामक त्रुटि फेंकता है। भ्रामक, ज़ाहिर है, इस तथ्य में कि जब वांछित परिणाम हुआ होता है तो आपको लाल त्रुटि पाठ नहीं दिखना चाहिए।

क्या किसी के पास लाल पाठ को दबाने का कोई तरीका है? मैंने जो भी कोशिश की है, वह 'CREATE/ALTER प्रक्रिया किसी क्वेरी बैच' त्रुटि में पहला कथन होना चाहिए या किसी अन्य तरीके से त्रुटि होनी चाहिए।

+0

की संभावित डुप्लिकेट [? क्या आप एसक्यूएल सर्वर बनाने या बदलने के लिए में क्या करते] (http://stackoverflow.com/questions/1434160/what-do-you-do-in-sql -सर्वर-टू-बिल्ड-या-ऑल्टर) – ruffin

+0

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

उत्तर

46

यह काम करते हैं और अनुमतियाँ बरकरार रखेंगे:

use [myDatabase] 
go 
if object_id('dbo.myProcedure', 'p') is null 
    exec ('create procedure myProcedure as select 1') 
go 
alter procedure myProcedure as 
SET NOCOUNT ON 
    -- real sproc code here. you don't really need BEGIN-END 
go 
+0

हां। मैं इस चाल के बारे में भूल गया था। – RBarryYoung

+0

मुझे अपना स्टार्ट-एंड पसंद है। – quillbreaker

+0

यह उपयोगकर्ता द्वारा परिभाषित कार्यों के साथ भी काम करता है, जहां मुझे "परिवर्तन" की आवश्यकता मिलती है क्योंकि फ़ंक्शन का उपयोग कई चीजों द्वारा किया जा रहा था। ओपी को, यह विकल्प चुना जाएगा, आईएमएचओ। – granadaCoder

9

इस तरह:

IF NOT EXISTS (SELECT * FROM sys.objects 
       WHERE object_id = OBJECT_ID(N'[dbo].[myProcedure]') 
        AND type in (N'P', N'PC')) 
BEGIN 
    EXEC(' 
     create procedure myProcedure as 
     begin 
      print ''placeholder'' 
     end 
     ') 
END 

EXEC(' 
    alter procedure myProcedure as 
    begin 
     -- real sproc code here 
    end 
    ') 

नोट:

  1. गतिशील एसक्यूएल तार में आपके उद्धरण अप दोगुना करने के लिए याद है।
  2. मैंने इसे पठनीयता के लिए इंडेंट किया है, लेकिन यह आपकी वास्तविक प्रक्रिया सूची में अतिरिक्त इंडेंट रिक्त स्थान भी जोड़ देगा। यदि आप इसे नहीं चाहते हैं, तो गतिशील एसक्यूएल पाठ पर इंडेंटेशन स्तर को कम करें।
+0

एफवाईआई, मैं हमेशा ऑनलाइन पोस्ट करते समय BEGIN..ENDs में जोड़ने का प्रयास करता हूं। सिर्फ इसलिए कि मैंने नौसिखिया को अपने पैर में शूट करने के कितने बार देखा है जब वे किसी और के एसक्यूएल में लाइन जोड़ने की कोशिश करते हैं लेकिन BEGIN.END को जोड़ना भूल जाते हैं। – RBarryYoung

+0

असाधारण, वास्तव में। एक नई लाइन पर "जाओ" पूरी तरह से इसे स्कॉप्स करता है। क्या कहना है कि कोई 'प्रारंभ ... अंत' नहीं करेगा और 'END' के बाद और अधिक बयान देगा, लेकिन 'जाओ' से पहले? लेकिन यह सिर्फ एक राय है और हर किसी के हकदार है! – RichardTheKiwi

+0

@ रिचर्डथीकिवी: यह एक असामान्य गलती है। (खैर, गलतफहमी जीओ एक आम गलती है, लेकिन यह आम तौर पर अलग-अलग रूप से प्रकट होता है, क्योंकि दायरे से बाहर चर) आमतौर पर, जो समस्या मैं बिना किसी BEGIN के साथ देखता हूं वह यह है कि वे भूल जाएंगे कि वे शाखा में कई बयानों के लिए जरूरी हैं/ब्लॉक। जब BEGIN ..अंत वहाँ है, ऐसा लगता है कि उन्हें "याद दिलाना" लगता है, इसलिए वे ब्लॉक के बाहर नई लाइन नहीं डाल पाएंगे। (कम से कम मैंने कभी गलती नहीं देखी है) – RBarryYoung

4

अंत में दिन यहाँ है जहां एसक्यूएल सर्वर या बदलें एक बराबर लागू किया गया है। उनका समकक्ष "बनाएं या बदलें" है। यह SQL सर्वर 2016 SP1 के रूप में उपलब्ध है। उदाहरण उपयोग:

use [myDatabase] 
go 

Create or Alter procedure myProcedure as 
begin 
    -- procedure code here 
end 
go 
संबंधित मुद्दे