यह जांचने के लिए कि इसे बनाने से पहले कोई संग्रहीत प्रक्रिया मौजूद है या नहीं


283

मेरे पास एक एसक्यूएल स्क्रिप्ट है जिसे हर बार क्लाइंट को "डेटाबेस प्रबंधन" कार्यक्षमता को निष्पादित करना पड़ता है। स्क्रिप्ट में क्लाइंट डेटाबेस पर संग्रहीत कार्यविधियाँ बनाना शामिल है। इनमें से कुछ क्लाइंट के पास स्क्रिप्ट चलाने की प्रक्रिया पहले से ही हो सकती है, और कुछ नहीं हो सकती है। मुझे ग्राहक डेटाबेस में संग्रहीत संग्रहीत कार्यविधियाँ जोड़ने की आवश्यकता है, लेकिन इससे कोई फर्क नहीं पड़ता कि मैं टी-एसक्यूएल वाक्यविन्यास को मोड़ने की कितनी कोशिश करता हूँ, मुझे मिलता है

बनाएँ / बेहतर प्रक्रिया 'एक क्वेरी बैच में पहला बयान होना चाहिए

मैंने पढ़ा है कि काम करने से पहले गिरना, लेकिन मुझे यह इस तरह से करना पसंद नहीं है।

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO

CREATE PROCEDURE MyProc
...

मैं किसी संग्रहीत प्रक्रिया के अस्तित्व के लिए जांच कैसे जोड़ सकता हूं और अगर यह मौजूद नहीं है तो इसे बनाएं लेकिन अगर यह मौजूद है तो इसे बदल दें?


2
नहीं, यह काम नहीं करता है, क्योंकि यह एक संग्रहीत प्रक्रिया बनाता है जो कथित रूप से वह नहीं है जो आप चाहते हैं। हम जो देख सकते हैं, वह उसके किए जाने के बाद उसे नहीं छोड़ता है, इसलिए, यह निश्चित रूप से शब्द के सभी पहलुओं में संग्रहीत है। यह अप्रासंगिक नहीं है कि आपको गैर-संग्रहित प्रक्रिया की आवश्यकता क्यों है
डेविड हेदलंड 15'10

'गैर-संग्रहित' प्रक्रिया से आपका क्या तात्पर्य है? आपका सभी नमूना एक संग्रहीत प्रक्रिया को फिर से बनाना है; इसका आपके सवाल से क्या लेना-देना है?
आकाशवाणी

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

हर बार जब वे स्क्रिप्ट चलाते हैं, तो यह प्रक्रिया को फिर से बनाने की कोशिश करेगा (दुर्भाग्यपूर्ण, यह सब कुछ स्क्रिप्ट में समान होना चाहिए। क्रैक फ़ाइल जिसमें प्रक्रिया बनाना कॉल भी शामिल है)। अगर वाक्य रचना के कारण सीमा समाप्त नहीं होती है तो काम नहीं करता है। मैं क्या कर सकता हूँ?
द शापर

3
के संभावित डुप्लिकेट stackoverflow.com/questions/937908/...
माइकल Freidgeim

जवाबों:


199

आप प्रक्रियात्मक कोड चला सकते हैं कहीं भी आप एक क्वेरी चलाने में सक्षम हैं।

बस सब कुछ कॉपी करें AS:

BEGIN
    DECLARE @myvar INT
    SELECT  *
    FROM    mytable
    WHERE   @myvar ...
END

यह कोड ठीक वही काम करता है जो एक संग्रहित खरीद करती है, लेकिन डेटाबेस की तरफ संग्रहीत नहीं होता है।

यह काफी हद तक अनाम प्रक्रिया कहलाती है PL/SQL

अपडेट करें:

आपका प्रश्न शीर्षक थोड़ा भ्रमित करने वाला है।

यदि आपको केवल एक प्रक्रिया बनाने की आवश्यकता है यदि यह मौजूद नहीं है, तो आपका कोड बस ठीक है।

यहाँ SSMSबनाएँ स्क्रिप्ट में आउटपुट क्या है :

IF EXISTS ( SELECT  *
            FROM    sys.objects
            WHERE   object_id = OBJECT_ID(N'myproc')
                    AND type IN ( N'P', N'PC' ) ) 
DROP 
CREATE 

अपडेट करें:

स्कीमा को शामिल करने के तरीके का उदाहरण:

IF EXISTS ( SELECT * 
            FROM   sysobjects 
            WHERE  id = object_id(N'[dbo].[MyProc]') 
                   and OBJECTPROPERTY(id, N'IsProcedure') = 1 )
BEGIN
    DROP PROCEDURE [dbo].[MyProc]
END

ऊपर के उदाहरण में, dbo स्कीमा है।

अपडेट करें:

SQL Server 2016+ में, आप बस कर सकते हैं

CREATE OR ALTER PROCEDURE dbo.MyProc


हां यह सच है, लेकिन आप सभी प्रक्रियात्मक कार्यक्षमता को ढीला कर देंगे क्योंकि कोई प्रक्रिया, udfs, विचार और जैसे कि प्रश्नों के भीतर से कॉल करने के लिए संग्रहीत नहीं किए जाएंगे। (क्षमा करें, इसे संपादित किया, इससे मेरे सिर में X- () का अर्थ हो गया)
एड्रियन स्टेंडर

1
हां, लेकिन आप अन्य प्रक्रियाओं के भीतर से प्रक्रियाओं को कॉल कर सकते हैं, या किसी तालिका में इनपुट के रूप में उनकी वापसी का उपयोग कर सकते हैं।
एड्रियन स्टैंडर

@astander: आप संग्रहीत प्रक्रियाओं से अनाम कोड भी कह सकते हैं। उनके आउटपुट का उपयोग करने के लिए INSERT, आपको उपयोग करने की आवश्यकता होगी OPENROWSETया OPENQUERYजो अनाम कोड के साथ भी काम करेगा। बेशक अनाम कोड में कमियां हैं: उदाहरण के लिए, यह केवल कॉलर के विशेषाधिकारों के तहत चलता है। मेरा कहना है कि यह संभव है, चीजों को करने का पसंदीदा तरीका नहीं :)
Quassnoi

"यदि आपको केवल एक प्रक्रिया बनाने की आवश्यकता है यदि यह मौजूद नहीं है, तो आपका कोड ठीक है।" और ठीक यही मैं जानना चाहता था। मैंने वास्तविक स्क्रिप्ट पर SSMS क्रिएट का उपयोग करने की कोशिश की लेकिन यह अच्छा नहीं हुआ। लेकिन धन्यवाद Quassnoi, और मैं अस्पष्ट प्रश्न के बारे में क्षमा चाहता हूँ।
द शेपर

2
जब आप इस तरीके से लागू किए जाते हैं तो DROP / CREATE के आसपास लेन-देन को लपेट नहीं सकते, तो गतिशील SQL का उपयोग नहीं करते समय एक बैच में केवल PROC कथन होना चाहिए। DROP PROC कॉल के बाद GO (बैच सेपरेटर) होना चाहिए।
शिव

449

मुझे लगता है कि यह पहले से ही उत्तर के रूप में चिह्नित किया गया है, लेकिन हम इसे इस तरह से करते थे:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('dbo.MyProc'))
   exec('CREATE PROCEDURE [dbo].[MyProc] AS BEGIN SET NOCOUNT ON; END')
GO

ALTER PROCEDURE [dbo].[MyProc] 
AS
  ....

बस प्रक्रिया को छोड़ने से बचने के लिए।


74
बस इस बारे में कुछ नोट्स जोड़ने के लिए कि यह एक अच्छा विचार क्यों है: 1) एक बूंद किसी भी सुरक्षा सेटिंग्स को साफ कर देगी, 2) इसे इस तरह से करने से, यदि किसी कारण से स्क्रिप्ट में परिवर्तन विफल हो जाता है, तो स्पाइ को गिरा नहीं दिया जाएगा।
रयान गिल

10
यह वास्तव में सही उत्तर है। यह प्रश्न में संग्रहीत खरीद पर किसी भी अनुदान खोने से बचा जाता है।
एंडी_ वुल्फ

7
इस दृष्टिकोण का एक बड़ा लाभ यह है कि उस समय का कोई मतलब नहीं है जब संग्रहीत प्रक्रिया मौजूद नहीं है। यह महत्वपूर्ण हो सकता है अगर अपडेट को एक महत्वपूर्ण प्रणाली पर लागू किया जा रहा है, जबकि यह अभी भी अन्य लोगों, सिस्टम या थ्रेड द्वारा उपयोग में है। समय-समय पर संग्रहीत कार्यविधि को छोड़ने के कारण होने वाली त्रुटियों को ट्रैक करना काफी अप्रिय हो सकता है क्योंकि वे पुन: पेश करने में बहुत मुश्किल होते हैं।
जेम्स

3
यह कई कारणों के लिए एक बढ़िया समाधान है, जो पहले से ही उल्लेख किया गया है, और मैं यह जोड़ना चाहूंगा कि अगर डीबीए मेटा-डेटा (जैसे बनाई गई तारीख) की खरीद पर भरोसा करता है, तो यह उस सामान को बरकरार रखता है, जो खरीद बनाने के बजाय बरकरार है। हर बार नया। मैं अपने प्रोक्स को बनाए रखने के लिए अपनी टीम के "सर्वश्रेष्ठ अभ्यास" में बदल जाने की कोशिश कर रहा हूं, जिसे आमतौर पर कई डीबी के लिए कॉपी / प्रचारित करना पड़ता है।
नैटज

2
यह भी विचार करें कि कुछ लोग चाहते हैं कि जिस स्थिति में वे बदल रहे हैं , उस स्थितिGRANT में विवरणों की खोज हो ; इसलिए इसके बजाय उपयोग करने का औचित्य अभी भी है । DROPALTER
कोडी स्टॉट

123

यदि आप इसे हटाने से पहले डेटाबेस ऑब्जेक्ट के अस्तित्व की जांच करने का सबसे सरल तरीका खोज रहे हैं, तो यहां एक तरीका (उदाहरण SPROC का उपयोग करता है, ठीक ऊपर जैसा आपका उदाहरण है, लेकिन तालिकाओं, अनुक्रमित, आदि के लिए संशोधित किया जा सकता है ...):

IF (OBJECT_ID('MyProcedure') IS NOT NULL)
  DROP PROCEDURE MyProcedure
GO

यह त्वरित और सुरुचिपूर्ण है, लेकिन आपको यह सुनिश्चित करने की आवश्यकता है कि आपके पास सभी ऑब्जेक्ट प्रकारों में अद्वितीय ऑब्जेक्ट नाम हैं क्योंकि यह उस पर ध्यान नहीं देता है।

आशा है कि ये आपकी मदद करेगा!


62
वह बेहतर: IF (OBJECT_ID ('MyProcedure', 'P') IS NULL नहीं है) DROP PROCEDURE MyProcedure GO
alerya

33

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

IF OBJECT_ID('MyProcedure', 'P') IS NOT NULL
    DROP PROCEDURE MyProcedure
GO

दूसरा पैरामीटर OBJECT_IDकेवल उन वस्तुओं की तलाश करना बताता है object_type = 'P', जो संग्रहीत प्रक्रियाएं हैं:

AF = एग्रिगेट फ़ंक्शन (CLR)

C = CHECK बाधा

D = DEFAULT (बाधा या अकेले खड़े)

एफ = विदेश कुंजी बाधा

FN = SQL स्केलर फ़ंक्शन

एफएस = विधानसभा (सीएलआर) स्केलर-फ़ंक्शन

एफटी = असेंबली (सीएलआर) तालिका-मूल्यवान फ़ंक्शन

IF = SQL इनलाइन टेबल-वैल्यू फ़ंक्शन

आईटी = आंतरिक तालिका

पी = SQL संग्रहित प्रक्रिया

पीसी = असेंबली (सीएलआर) संग्रहीत-प्रक्रिया

पीजी = योजना गाइड

पीके = प्राथमिक कुंजी बाधा

R = नियम (पुरानी शैली, स्टैंड-अलोन)

RF = प्रतिकृति-फ़िल्टर-प्रक्रिया

एस = सिस्टम बेस टेबल

एसएन = पर्यायवाची

SO = अनुक्रम वस्तु

TF = SQL टेबल-वैल्यू-फंक्शन

टीआर = ट्रिगर

आप के माध्यम से विकल्पों की पूरी सूची प्राप्त कर सकते हैं:

SELECT name 
FROM master..spt_values
WHERE type = 'O9T'

1
टीएफ गायब है। फिर भी, इस सूची को प्रदान करने के लिए +1
Crono

इसके अलावा टीआर फॉर ट्रिगर
कार्लोस ओरो


23

मुझे पता है कि यह एक बहुत पुराना पोस्ट है, लेकिन चूंकि यह शीर्ष खोज परिणामों में प्रकट होता है, इसलिए SQL सर्वर 2016 SP1 का उपयोग करने वालों के लिए नवीनतम अपडेट जोड़ रहा है -

create or alter procedure procTest
as
begin
 print (1)
end;
go

यह एक संग्रहीत प्रक्रिया बनाता है यदि पहले से मौजूद नहीं है, लेकिन मौजूद होने पर इसे बदल देता है।

संदर्भ


1
यह ऐसा है, इतना उपयोगी है।
एजेंटफायर

मैं यह केवल SQL स्टूडियो में काम करता है पर जोर देना चाहता हूँ - एक sql फ़ाइल में यह मेरे लिए विफल रहता है।
जेम्स एल।

10

DROP IF EXISTS SQL सर्वर 2016 की एक नई विशेषता है

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

DROP  PROCEDURE IF EXISTS dbo.[procname]

1
यह SqlServer सिंटैक्स नहीं है ..., उत्तर हटाने से पहले सलाह देना चाहिए कि लोग डाउनवोटिंग शुरू करें और न्यूबॉक्स् के लिए भ्रम से बचें।
पावेल Czapski

@PawelCz यह SQL Server 2016 और के लिए मान्य है, मैंने उत्तर प्रतिरूपित किया है। प्रतिक्रिया के लिए धन्यवाद!
JayJay

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

7

मेरी भी यही त्रुटि थी। मुझे पता है कि यह धागा पहले से ही बहुत ज्यादा मृत है, लेकिन मैं "अनाम प्रक्रिया" के अलावा एक और विकल्प स्थापित करना चाहता हूं।

मैंने इसे इस तरह हल किया:

  1. जांचें कि क्या संग्रहीत प्रक्रिया मौजूद है:

    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='my_procedure') BEGIN
        print 'exists'  -- or watever you want
    END ELSE BEGIN
        print 'doesn''texists'   -- or watever you want
    END
  2. हालाँकि "CREATE/ALTER PROCEDURE' must be the first statement in a query batch"अभी भी है। मैंने इसे इस तरह हल किया:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE -- view procedure function or anything you want ...
  3. मैं इस कोड को समाप्त करता हूं:

    IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID('my_procedure'))
    BEGIN
        DROP PROCEDURE my_procedure
    END
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE PROCEDURE [dbo].my_procedure ...

अगर आपको DROP PROCEDURE की तरह केवल 1 लाइन का कोड है तो आपको शुरुआत और अंत की आवश्यकता नहीं है ...
Phillip Senn

चेतावनी: 'जाँचें कि क्या संग्रहित प्रक्रिया मौजूद है' फ़ंक्शन हमेशा वापस आएगा 'मौजूद है', इससे कोई फर्क नहीं पड़ता कि आपने (टी-एसक्यूएल के लिए) कौन सा फ़ंक्शन नाम रखा है। यह एक अविश्वसनीय जाँच है।
रयान बैटीस्टोन

एक बेहतर विकल्प: यदि EXISTS (SELECT 1 FROM sys.procedures WHERE = = name_of_table_as_seen_in_sysprocedures)) BEGIN -1 को 'स्टेटस' के रूप में सिलेक्ट करता है। END
रेयान बैटिस्टोन

5

यहाँ एक तरीका है और कुछ इस तरह से उपयोग करने के पीछे तर्क है। यह संग्रहीत खरीद को संपादित करने के रूप में सुंदर नहीं है, लेकिन पेशेवरों और विपक्ष हैं ...

अद्यतन: आप इस पूरे कॉल को एक ट्रांजेक्शन में भी लपेट सकते हैं। एक एकल लेनदेन में कई संग्रहीत प्रक्रियाएं शामिल हैं जो सभी को कम या सभी रोलबैक कर सकती हैं। लेन-देन में लपेटने का एक और लाभ यह है कि संग्रहीत प्रक्रिया हमेशा अन्य SQL कनेक्शनों के लिए मौजूद रहती है, जब तक वे READ UNCOMMITTED लेनदेन अलगाव स्तर का उपयोग नहीं करते हैं!

1) एक प्रक्रिया निर्णय के रूप में केवल अलर्ट से बचें। हमारी प्रक्रियाएँ हमेशा से ही हैं, अगर यह कम हो जाता है। यदि आप नए PROC को वांछित खरीदने का एक ही पैटर्न मानते हैं, तो alters के लिए खानपान थोड़ा कठिन है क्योंकि आपके पास IF EXTERTS ALTER ELSE CREATE होगा।

2) आपको बैच में पहली कॉल के रूप में CREATE / ALTER लगाना होगा ताकि आप डायनेमिक SQL के साथ लेन-देन में प्रक्रिया अपडेट का क्रम न लपेट सकें। मूल रूप से यदि आप प्रक्रिया अद्यतन का एक पूरा ढेर चलाना चाहते हैं या DB बैकअप को पुनर्स्थापित किए बिना उन सभी को वापस रोल करना चाहते हैं, तो यह एक ही बैच में सब कुछ करने का एक तरीका है।

IF NOT EXISTS (select ss.name as SchemaName, sp.name as StoredProc 
    from sys.procedures sp
    join sys.schemas ss on sp.schema_id = ss.schema_id
    where ss.name = 'dbo' and sp.name = 'MyStoredProc')
BEGIN
    DECLARE @sql NVARCHAR(MAX)

    -- Not so aesthetically pleasing part. The actual proc definition is stored
    -- in our variable and then executed.
    SELECT @sql = 'CREATE PROCEDURE [dbo].[MyStoredProc]
(
@MyParam int
)
AS
SELECT @MyParam'
    EXEC sp_executesql @sql
END

5

Sql सर्वर 2008 के बाद, आप " INFORMATION_SCHEMA.ROUTINES" का उपयोग कर सकते हैं

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES 
  WHERE ROUTINE_NAME = 'MySP'
        AND ROUTINE_TYPE = 'PROCEDURE') 

3

मेरे पास स्पष्ट रूप से वोट या टिप्पणी करने के लिए आवश्यक प्रतिष्ठा नहीं है, लेकिन मैं सिर्फ यह कहना चाहता था कि EXEC (sp_executesql का उपयोग करके जियोफ का जवाब बेहतर हो सकता है) निश्चित रूप से जाने का रास्ता है। संग्रहीत प्रक्रिया को फिर से बनाने और फिर से बनाने से अंत में काम पूरा हो जाता है, लेकिन एक समय ऐसा भी आता है, जिसमें संग्रहीत प्रक्रिया बिल्कुल भी मौजूद नहीं होती है, और यह बहुत बुरा हो सकता है, खासकर अगर यह कुछ ऐसा हो बार-बार दौड़ना। मुझे अपने आवेदन में हर तरह की समस्या हो रही थी क्योंकि एक बैकग्राउंड थ्रेड एक IF EXISTS DROP कर रहा था ... एक ही समय में एक और थ्रेड संग्रहीत कार्यविधि का उपयोग करने का प्रयास कर रहा था।


3

** T-Sql में एक संग्रहित खरीद को फिर से गिराने और फिर से बनाने का सबसे सरल तरीका है **

Use DatabaseName
go
If Object_Id('schema.storedprocname') is not null
begin
   drop procedure schema.storedprocname
end
go

create procedure schema.storedprocname
as

begin
end

3

यहां वह स्क्रिप्ट है जिसका मैं उपयोग करता हूं। इसके साथ, मैं अनावश्यक रूप से संग्रहीत procs को छोड़ने और पुनः बनाने से बचता हूं।

IF NOT EXISTS (
    SELECT *
    FROM sys.objects
    WHERE object_id = OBJECT_ID(N'[dbo].[uspMyProcedure]')
    )
BEGIN
  EXEC sp_executesql N'CREATE PROCEDURE [dbo].[uspMyProcedure] AS select 1'
END
GO

ALTER PROCEDURE [dbo].[uspMyProcedure] 
    @variable1 INTEGER  
AS
BEGIN
   -- Stored procedure logic
END

2

संग्रहीत कार्यविधि के लिए आईएफ अस्तित्व की जाँच करें

IF EXISTS (SELECT * FROM sys.objects 
            WHERE object_id = OBJECT_ID
             (N'[Schema].[Procedure_Name]') AND type IN (N'P', N'PC'))
BEGIN
       DROP PROCEDURE [Schema].[Procedure_Name]
       Print('Proceudre dropped => [Schema].[Procedure_Name]')
END

ट्रिगर के लिए IF एक्जिस्ट चेक करें, नीचे दिए गए लिंक पर क्लिक करके भी http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html


1

आप सरल तरीके से क्यों नहीं जाते

    IF EXISTS(SELECT * FROM sys.procedures WHERE NAME LIKE 'uspBlackListGetAll')
    BEGIN
         DROP PROCEDURE uspBlackListGetAll
    END
    GO

    CREATE Procedure uspBlackListGetAll

..........


यहां एक%% कथन का उपयोग करने के लिए बुरा विचार। क्या होगा अगर ओपी के पास एक और स्पाइक था जैसे कि uspBlackListGetAll_V2 जो वे छोड़ना नहीं चाहते थे?
डेव होगन

@DaveHogan मैं सहमत हूँ। हालाँकि, उन्होंने एक नहीं लगाया %, इसलिए LIKE=
डिएगो जेंसिक

1
@DiegoJancic यदि आप संपादित इतिहास को देखेंगे तो आप देखेंगे कि यह मूल रूप से '%' के साथ था
डेव होगन

0

@Geoff से जवाब के अलावा मैंने एक सरल टूल बनाया है जो एक SQL-फ़ाइल बनाता है जो संग्रहीत कार्यविधियाँ, दृश्य, फ़ंक्शंस और ट्रिगर के लिए बयान करता है।

MyDbUtils @ CodePlex देखें । यहां छवि विवरण दर्ज करें


1
मुझे लगता है कि प्रबंधन स्टूडियो पहले से ही इस तरह के उपकरण देता है। इसे "जनरेट स्क्रिप्ट्स" कहा जाता है
Hybris95

0

मैं सोचता हूं! क्यों मैं इस तरह से पूरी क्वेरी नहीं लिखता

GO
create procedure [dbo].[spAddNewClass] @ClassName varchar(20),@ClassFee int
as
begin
insert into tblClass values (@ClassName,@ClassFee)
end

GO
create procedure [dbo].[spAddNewSection] @SectionName varchar(20),@ClassID       int
as
begin
insert into tblSection values(@SectionName,@ClassID)
end

Go
create procedure test
as
begin 
select * from tblstudent
end

मुझे पहले से ही पता है कि पहले दो प्रक्रियाएँ पहले से मौजूद हैं, sql चलेगा, क्वेरी पहले दो प्रक्रियाओं की त्रुटि देगा, लेकिन फिर भी यह अंतिम प्रक्रिया बनाएगा SQl खुद ही इस बात का ध्यान रख रहा है कि जो पहले से मौजूद है वह वही है जो मैं हमेशा अपने सभी के लिए करता हूँ ग्राहकों!


-2

क्रीएट प्रोसीजर इफ नॉट इज़ नॉट 'एक्ज़ाम्स योर-नेम' () बीगिन ... END


यदि प्रक्रिया मौजूद है तो यह कुछ भी नहीं करेगा। अनुरोधकर्ता प्रक्रिया में परिवर्तन करना चाहता है यदि यह मौजूद है, तो इसे बनाएं यदि नहीं।
रैंडी गैमेज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.