एक संग्रहीत कार्यविधि एक में संकलित SQL कथनों का एक समूह है। संग्रहीत कार्यविधियों में व्यावसायिक तर्क और अन्य प्रोग्रामिंग संरचनाएँ शामिल हो सकती हैं।
SQL सर्वर में, एक संग्रहीत कार्यविधि एक या अधिक Transact-SQL कथनों का समूह या Microsoft .NET Framework सामान्य रनटाइम भाषा (CLR) विधि का संदर्भ है।
प्रोग्रामेबिलिटी
लेकिन एक संग्रहित प्रक्रिया सिर्फ एक लंबी स्क्रिप्ट से कहीं अधिक है। यह एक स्क्रिप्ट है जिसे विशेष रूप से संग्रहीत कार्यविधियों के अंतर्गत SQL सर्वर में सहेजा गया है नोड, और यह कर सकता है:
- इनपुट पैरामीटर स्वीकार करें (और कॉलिंग प्रोग्राम में आउटपुट पैरामीटर के रूप में कई मान लौटाएं)।
- प्रोग्रामिंग स्टेटमेंट होते हैं।
- सफलता या विफलता, और किसी भी विफलता के कारण को इंगित करने के लिए कॉलिंग प्रोग्राम को स्थिति मान लौटाएं।
संग्रहीत प्रक्रियाओं में अक्सर व्यावसायिक तर्क होते हैं। उदाहरण के लिए, एक संग्रहीत कार्यविधि उन पैरामीटरों को स्वीकार कर सकती है जो इसे पास किए गए हैं और IF
. का उपयोग करके उन पैरामीटरों के विरुद्ध परीक्षण कर सकते हैं बयान। उदाहरण के लिए, यदि पैरामीटर एक मान है, तो ऐसा करें, यदि यह दूसरा मान है, तो ऐसा करें।
संग्रहीत कार्यविधियाँ किसी अनुप्रयोग में प्रदर्शन में सुधार कर सकती हैं, क्योंकि संग्रहीत कार्यविधि के बनते ही इसे पार्स और अनुकूलित किया जाता है, और फिर स्मृति में संग्रहीत किया जाता है। संग्रहीत प्रक्रिया के माध्यम से एक सशर्त क्वेरी चलाना बेहद तेज़ हो सकता है - एक ऐसे एप्लिकेशन की तुलना में जो पूरे नेटवर्क में एक क्वेरी भेजता है, SQL सर्वर पर, फिर पूरे नेटवर्क में सभी डेटा वापस कर दिया जाता है ताकि यह इसके माध्यम से फ़िल्टर कर सके, और बाहर निकाल सके केवल वे रिकॉर्ड जिनमें उसकी रुचि है।
संग्रहीत कार्यविधियों के लाभ
यहाँ संग्रहीत कार्यविधियों का उपयोग करने के कुछ मुख्य लाभ दिए गए हैं:
लाभ | स्पष्टीकरण |
---|---|
मॉड्यूलर प्रोग्रामिंग | आप एक संग्रहित प्रक्रिया को एक बार लिख सकते हैं, फिर उसे एप्लिकेशन के विभिन्न हिस्सों से (और यहां तक कि कई एप्लिकेशन से भी) बार-बार कॉल कर सकते हैं। |
प्रदर्शन | संग्रहीत कार्यविधियाँ तेज़ कोड निष्पादन प्रदान करती हैं और नेटवर्क ट्रैफ़िक को कम करती हैं।
|
सुरक्षा | उपयोगकर्ता किसी भी कथन को सीधे निष्पादित किए बिना संग्रहीत कार्यविधि को निष्पादित कर सकते हैं। इसलिए, एक संग्रहीत कार्यविधि उन उपयोगकर्ताओं के लिए उन्नत डेटाबेस कार्यक्षमता प्रदान कर सकती है जिनके पास सामान्य रूप से इन कार्यों तक पहुंच नहीं होगी, लेकिन यह कार्यक्षमता कड़े नियंत्रित तरीके से उपलब्ध कराई गई है। |
एक संग्रहित प्रक्रिया कैसे बनाएं
एक संग्रहीत कार्यविधि बनाने के लिए, CREATE PROCEDURE
. का उपयोग करें कथन, उसके बाद कोड जो संग्रहीत कार्यविधि बनाता है। यदि आपकी संग्रहीत प्रक्रिया पैरामीटर स्वीकार करने जा रही है, तो उन्हें नाम के बाद शामिल करने की आवश्यकता है।
CREATE PROCEDURE myStoredProcedure AS ... OR CREATE PROCEDURE myStoredProcedure @ParameterName DataType AS ...
अब हम पहले बनाए गए विचारों में से एक के आधार पर एक संग्रहीत कार्यविधि बनाएंगे — RecentAlbums देखें।
यह दृश्य पिछले 20 वर्षों में रिलीज़ किए गए सभी एल्बम लौटाता है। यह तब तक ठीक है जब तक इसे केवल 20 साल पीछे देखने की आवश्यकता होगी। लेकिन क्या होगा यदि आप चाहते हैं कि उपयोगकर्ता यह चुने कि इसे कितने वर्षों तक कवर करना चाहिए?
एक संग्रहीत प्रक्रिया इस समस्या को हल कर सकती है।
हम एक संग्रहीत कार्यविधि बनाएंगे जो एक पैरामीटर को स्वीकार करती है। पैरामीटर का मान वापस खोजने के लिए वर्षों की संख्या होगी। इसलिए, यह मान उपयोगकर्ता द्वारा निर्दिष्ट किया जा सकता है जब भी वे संग्रहीत कार्यविधि को निष्पादित करते हैं।
-
संग्रहीत कार्यविधि डिज़ाइन करें
एक नई क्वेरी विंडो खोलें और संग्रहीत कार्यविधि के लिए कोड जोड़ें।
हमारे मामले में, हम RecentArtists . से कोड कॉपी/पेस्ट करेंगे शीर्ष भाग को देखें और संशोधित करें, ताकि यह एक संग्रहीत कार्यविधि बन जाए।
हम
@Count
. नामक एक पैरामीटर जोड़ेंगे यह निर्धारित करेगा कि संग्रहीत कार्यविधि को कितने वर्ष पीछे देखना चाहिए।इसलिए हम
20
. के हार्डकोडेड मान को बदल देंगे@Count
. के साथनमूना कोड
यहाँ हमारे उदाहरण से कोड है:
CREATE PROCEDURE spRecentAlbums @Count int AS SELECT Albums.ReleaseDate, Albums.AlbumName, Genres.Genre, Artists.ArtistName, Artists.ActiveFrom FROM Albums INNER JOIN Artists ON Albums.ArtistId = Artists.ArtistId INNER JOIN Genres ON Albums.GenreId = Genres.GenreId WHERE (Albums.ReleaseDate > DATEADD(year, - @Count, GETDATE()));
-
संग्रहीत प्रक्रिया बनाएं
एक बार यह सब अच्छा लगने के बाद, आप संग्रहीत कार्यविधि बनाने के लिए कथन निष्पादित कर सकते हैं।
निष्पादित करें . क्लिक करें संग्रहीत कार्यविधि बनाने के लिए।
एक बार संग्रहीत कार्यविधि बन जाने के बाद, आप इसे ऑब्जेक्ट एक्सप्लोरर में देख सकते हैं (आपको संग्रहीत कार्यविधियों को रीफ़्रेश करने की आवश्यकता हो सकती है पहले नोड)।
-
संग्रहीत प्रक्रिया निष्पादित करें
अब जब इसे बनाया गया है, तो आप संग्रहीत कार्यविधि को निष्पादित कर सकते हैं।
एक नई क्वेरी विंडो खोलें, इसे जोड़ें:
EXEC spRecentAlbums @Count = 5;
अब निष्पादित करें . पर क्लिक करें टूलबार से।
संग्रहित प्रक्रिया पिछले 5 वर्षों में जारी सभी एल्बम लौटा देगी।
-
विभिन्न पैरामीटर आज़माएं
यह देखने के लिए कि यह परिणामों को कैसे प्रभावित करता है, पैरामीटर के मान को बदलने का प्रयास करें।
आप एक के बाद एक कई स्टेटमेंट भी चला सकते हैं। प्रत्येक कथन के लिए एक नया परिणाम फलक दिखाई देगा।
संग्रहीत प्रक्रिया टेम्पलेट
SQL सर्वर 2016 में, आप संग्रहीत कार्यविधियाँ पर राइट-क्लिक करके एक संग्रहीत कार्यविधि बना सकते हैं ऑब्जेक्ट एक्सप्लोरर में नोड और नया> संग्रहित प्रक्रिया... . का चयन करना या नया> मूल रूप से संकलित संग्रहित प्रक्रिया... ।
इससे एक टेम्प्लेट खुल जाएगा जो आपकी अपनी विशिष्ट प्रक्रिया के साथ पॉप्युलेट होने के लिए तैयार है।
GUI के माध्यम से एक संग्रहीत कार्यविधि निष्पादित करें
आप संग्रहीत कार्यविधि को निष्पादित करने के लिए ग्राफिकल यूजर इंटरफेस का भी उपयोग कर सकते हैं।
-
निष्पादन प्रक्रिया लॉन्च करें डायलॉग बॉक्स
ऑब्जेक्ट एक्सप्लोरर में, संग्रहित प्रक्रिया पर राइट-क्लिक करें और संग्रहीत प्रक्रिया निष्पादित करें... चुनें ।
-
आपूर्ति पैरामीटर
संग्रहीत प्रक्रिया के लिए आवश्यक किसी भी पैरामीटर के लिए एक मान दर्ज करें, फिर ठीक . पर क्लिक करें ।
-
परिणाम
परिणाम प्रदर्शित होते हैं।
संग्रहीत प्रक्रिया को संशोधित करें
यदि आपको किसी मौजूदा संग्रहीत कार्यविधि को संशोधित करने की आवश्यकता है, तो बस CREATE
. को बदलें ALTER
. के साथ (अपडेट की गई प्रक्रिया के साथ) ।
यह उदाहरण संग्रहीत प्रक्रिया को संशोधित करता है ताकि परिणाम अवरोही क्रम में रिलीज की तारीख के अनुसार क्रमबद्ध हों:
ALTER PROCEDURE spRecentAlbums @Count int AS SELECT Albums.ReleaseDate, Albums.AlbumName, Genres.Genre, Artists.ArtistName, Artists.ActiveFrom FROM Albums INNER JOIN Artists ON Albums.ArtistId = Artists.ArtistId INNER JOIN Genres ON Albums.GenreId = Genres.GenreId WHERE (Albums.ReleaseDate > DATEADD(year, - @Count, GETDATE())) ORDER BY Albums.ReleaseDate DESC;
सिस्टम संग्रहित प्रक्रियाएं
SQL सर्वर में डेटाबेस व्यवस्थापन कार्यों में सहायता के लिए बड़ी संख्या में सिस्टम संग्रहीत कार्यविधियाँ शामिल हैं। कई कार्य जो आप GUI के माध्यम से कर सकते हैं उन्हें सिस्टम संग्रहीत कार्यविधि के माध्यम से किया जा सकता है। उदाहरण के लिए, कुछ चीज़ें जो आप सिस्टम संग्रहीत कार्यविधियों के साथ कर सकते हैं, उनमें शामिल हैं:
- सुरक्षा खाते कॉन्फ़िगर करें
- लिंक किए गए सर्वर सेट करें
- डेटाबेस रखरखाव योजना बनाएं
- पूर्ण पाठ खोज कैटलॉग बनाएं
- दूरस्थ लॉगिन जोड़ें
- प्रतिकृति कॉन्फ़िगर करें
- निर्धारित कार्य सेट करें
- और भी बहुत कुछ...
सिस्टम संग्रहीत कार्यविधियाँ sp_ . के साथ उपसर्ग करती हैं , इसलिए अपनी प्रक्रियाओं के लिए उस उपसर्ग का उपयोग करने से बचना सबसे अच्छा है।
नामकरण परंपराएं
अपनी संग्रहीत कार्यविधियों (और आपके डेटाबेस में अन्य सभी वस्तुओं के लिए) के लिए एक सुसंगत नामकरण परंपरा विकसित करना एक अच्छा विचार है।
कुछ लोग अपनी संग्रहित प्रक्रियाओं के आगे usp_ . लगाते हैं (उपयोगकर्ता द्वारा परिभाषित संग्रहीत कार्यविधि को इंगित करने के लिए), अन्य इसे SQL कीवर्ड से शुरू करते हैं जैसे चयन , सम्मिलित करें , अपडेट करें , हटाएं . अन्य एप्लिकेशन के लिए एक संक्षिप्त नाम का उपयोग करते हैं।
कुछ संग्रहीत कार्यविधि में प्रत्येक शब्द को अलग करने के लिए अंडरस्कोर का उपयोग करते हैं (उदाहरण के लिए, recent_albums ), जबकि अन्य टाइटल केस का उपयोग करेंगे (जैसे, RecentAlbums )।
इसलिए, यह संभव है कि इस्तेमाल की जा रही नामकरण परंपरा के आधार पर हमारी संग्रहीत कार्यविधि को निम्नलिखित में से कोई भी नाम दिया जा सकता है।
- हाल के एल्बम
- हाल के एल्बम
- uspRecentAlbums
- usp_recent_albums
- RecentAlbums चुनें
- select_RecentAlbums
- select_recent_albums
- RecentAlbums प्राप्त करें
- get_recent_albums
आपको चित्र मिल जाएगा। महत्वपूर्ण बात निरंतरता है। एक चुनें और उसके साथ रहें। जब आपको संग्रहीत प्रक्रिया का उपयोग करने की आवश्यकता होगी तो यह आसान हो जाएगा। कल्पना कीजिए कि स्कोर, या सैकड़ों संग्रहीत कार्यविधियाँ हैं, और हर बार जब आप किसी एक को निष्पादित करने के लिए जाते हैं, तो आपको इसे ऑब्जेक्ट एक्सप्लोरर में पूरी तरह से नेविगेट करने की आवश्यकता होती है क्योंकि आपको यह याद नहीं रहता है कि आपने इसे usp_RecentAlbums कहा है या नहीं। या uspRecentAlbums ।
जैसा कि बताया गया है, sp_ . का उपयोग करने से बचें आपके संग्रहीत कार्यविधि नामों के उपसर्ग के रूप में। SQL सर्वर इस उपसर्ग का उपयोग सिस्टम संग्रहीत कार्यविधियों के लिए करता है।
SQL सर्वर पहले सिस्टम संग्रहीत प्रक्रियाओं की खोज करता है, इसलिए सबसे अच्छा, आप एक प्रदर्शन हिट लेंगे। कम से कम, आपकी कार्यविधि नहीं चलेगी (यदि यह सिस्टम संग्रहीत कार्यविधि के साथ एक नाम साझा करती है)।