sql - एसक्यूएल सर्वर में फंक्शन बनाम संग्रहीत प्रक्रिया




sql-server tsql (11)

मैं कुछ समय के लिए कार्य और संग्रहित प्रक्रिया सीख रहा हूं लेकिन मुझे नहीं पता कि मुझे फ़ंक्शन या संग्रहीत प्रक्रिया का उपयोग क्यों करना चाहिए। वे मेरे लिए समान दिखते हैं, शायद क्योंकि मैं इसके बारे में थोड़ी नौसिखिया हूं।

क्या कोई मुझे बताएगा क्यों?


SQL सर्वर में, फ़ंक्शंस और संग्रहीत प्रक्रिया दो अलग-अलग प्रकार की इकाइयां होती हैं।

फंक्शन: SQL सर्वर डेटाबेस में, फ़ंक्शंस का उपयोग कुछ क्रियाओं को करने के लिए किया जाता है और कार्रवाई तुरंत परिणाम देता है। कार्य दो प्रकार हैं:

  1. सिस्टम परिभाषित

  2. उपयोगकर्ता परिभाषित

संग्रहीत प्रक्रियाएं: SQL सर्वर में, संग्रहीत प्रक्रिया सर्वर में संग्रहीत होती है और यह शून्य, एकल और एकाधिक मान लौटा सकती है। संग्रहीत प्रक्रियाएं दो प्रकार हैं:

  1. सिस्टम संग्रहीत प्रक्रियाओं
  2. उपयोगकर्ता परिभाषित प्रक्रियाओं

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

फिर, आप शहरों की पैरामीटर सूची के लिए एक फ़ंक्शन का उपयोग कर सकते हैं। dbo.GetCitiesIn ("NY") जो एक टेबल लौटाता है जिसे एक जॉइन के रूप में उपयोग किया जा सकता है।

यह कोड व्यवस्थित करने का एक तरीका है। यह जानना कि जब कुछ पुन: प्रयोज्य होता है और जब यह समय बर्बाद होता है तो केवल कुछ परीक्षण और त्रुटि और अनुभव के माध्यम से प्राप्त होता है।

साथ ही, SQL सर्वर में फ़ंक्शंस एक अच्छा विचार है। वे तेज़ हैं और काफी शक्तिशाली हो सकते हैं। इनलाइन और प्रत्यक्ष चयन करता है। सावधानी बरतने के लिए सावधान।


एसपी और यूडीएफ के बीच का अंतर नीचे सूचीबद्ध है:

+---------------------------------+----------------------------------------+
| Stored Procedure (SP)           | Function (UDF - User Defined           |
|                                 | Function)                              |
+---------------------------------+----------------------------------------+
| SP can return zero , single or  | Function must return a single value    |
| multiple values.                | (which may be a scalar or a table).    |
+---------------------------------+----------------------------------------+
| We can use transaction in SP.   | We can't use transaction in UDF.       |
+---------------------------------+----------------------------------------+
| SP can have input/output        | Only input parameter.                  |
| parameter.                      |                                        |
+---------------------------------+----------------------------------------+
| We can call function from SP.   | We can't call SP from function.        |
+---------------------------------+----------------------------------------+
| We can't use SP in SELECT/      | We can use UDF in SELECT/ WHERE/       |
| WHERE/ HAVING statement.        | HAVING statement.                      |
+---------------------------------+----------------------------------------+
| We can use exception handling   | We can't use Try-Catch block in UDF.   |
| using Try-Catch block in SP.    |                                        |
+---------------------------------+----------------------------------------+

कर्सर की तरह SQL सर्वर फ़ंक्शंस का उपयोग आपके अंतिम हथियार के रूप में किया जाना है! उनके पास प्रदर्शन समस्याएं हैं और इसलिए एक टेबल-मूल्यवान फ़ंक्शन का उपयोग करके जितना संभव हो सके से बचा जाना चाहिए। प्रदर्शन के बारे में बात करना एक टेबल के बारे में बात कर रहा है जिसमें एक मध्यम श्रेणी के हार्डवेयर पर सर्वर पर होस्ट किए गए 1,000,000 से अधिक रिकॉर्ड हैं; अन्यथा आपको कार्यों के कारण प्रदर्शन हिट के बारे में चिंता करने की आवश्यकता नहीं है।

  1. परिणाम को वापस करने के लिए कभी भी फ़ंक्शन का उपयोग न करें - बाहरी कोड (जैसे ADO.Net) पर सेट करें
  2. जितना संभव हो सके विचार / संग्रहित procs संयोजन का उपयोग करें। आप डीटीए (डाटाबेस ट्यूनिंग एडवाइजर) सुझावों का उपयोग करके भावी बढ़ते प्रदर्शन मुद्दों से पुनर्प्राप्त कर सकते हैं (जैसे अनुक्रमित विचार और आंकड़े) - कभी-कभी!

आगे के संदर्भ के लिए देखें: http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html


कार्यों की गणना गणना की जाती है और SQL सर्वर में स्थायी पर्यावरणीय परिवर्तन नहीं कर सकती (यानी कोई INSERT या अद्यतन विवरणों की अनुमति नहीं है)।

एसक्यूएल कथन में एक फ़ंक्शन का उपयोग किया जा सकता है यदि यह स्केलर मान देता है, या यदि परिणाम परिणाम सेट करता है तो इसमें शामिल हो सकता है।

टिप्पणियों से ध्यान देने योग्य एक बिंदु, जो उत्तर को सारांशित करता है। @ सेन के एंडरसन के लिए धन्यवाद:

कार्य कंप्यूटर-विज्ञान परिभाषा का पालन करते हैं कि उन्हें एक मूल्य वापस करना होगा और वे पैरामीटर (तर्क) के रूप में प्राप्त डेटा को बदल नहीं सकते हैं। कार्यों को कुछ भी बदलने की अनुमति नहीं है, कम से कम एक पैरामीटर होना चाहिए, और उन्हें एक मूल्य वापस करना होगा। संग्रहीत प्रोसेस में पैरामीटर नहीं होना चाहिए, डेटाबेस ऑब्जेक्ट्स बदल सकते हैं, और एक मान वापस नहीं करना है।


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


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

  • एसक्यूएल सर्वर में एक लघु कार्यक्रम की तरह है।
  • एक चुनिंदा कथन के रूप में सरल हो सकता है, या एक लंबी स्क्रिप्ट के रूप में जटिल हो सकता है जो डेटाबेस में एकाधिक तालिकाओं से डेटा जोड़ता है, हटाता है, अद्यतन करता है, और / या पढ़ता है।
  • (लूप और कर्सर लागू कर सकते हैं, जो दोनों डेटा पर पंक्ति संचालन द्वारा छोटे परिणामों या पंक्ति के साथ काम करने की अनुमति देते हैं।)
  • EXEC या EXECUTE कथन का उपयोग करके बुलाया जाना चाहिए।
  • तालिका चर लौटाता है, लेकिन हम OUT पैरामीटर का उपयोग नहीं कर सकते हैं।
  • लेनदेन का समर्थन करता है।

समारोह:

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

    SELECT dbo.functionname('Parameter1')
    

    या

    SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects
    
  • सरल पुन: प्रयोज्य चयन संचालन के लिए, फ़ंक्शन कोड को सरल बना सकते हैं। बस अपने कार्यों में JOIN क्लॉज का उपयोग करने से सावधान रहें। यदि आपके फ़ंक्शन में JOIN क्लॉज है और आप इसे किसी अन्य चयन कथन से कॉल करते हैं जो एकाधिक परिणाम देता है, तो फ़ंक्शन कॉल परिणाम सेट में लौटाई गई प्रत्येक पंक्ति के लिए उन तालिकाओं में एक साथ JOIN जाएगा। हालांकि वे कुछ तर्क को सरल बनाने में सहायक हो सकते हैं, लेकिन यदि वे ठीक से उपयोग नहीं किए जाते हैं तो वे प्रदर्शन बाधा भी हो सकते हैं।

  • OUT पैरामीटर का उपयोग कर मान देता है।
  • लेनदेन का समर्थन नहीं करता है।

संग्रहीत प्रक्रियाओं और उपयोगकर्ता परिभाषित कार्यों के बीच मतभेद:

  • संग्रहित कथनों में संग्रहीत प्रक्रियाओं का उपयोग नहीं किया जा सकता है।
  • संग्रहीत प्रक्रियाएं डिफरर्ड नाम समाधान का समर्थन करती हैं।
  • संग्रहीत प्रक्रियाओं का आमतौर पर व्यावसायिक तर्क करने के लिए उपयोग किया जाता है।
  • संग्रहीत प्रक्रियाएं किसी भी डेटाटाइप को वापस कर सकती हैं।
  • संग्रहीत प्रक्रिया उपयोगकर्ता परिभाषित कार्यों की तुलना में अधिक मात्रा में इनपुट पैरामीटर स्वीकार कर सकते हैं। संग्रहीत प्रक्रियाओं में 21,000 इनपुट पैरामीटर हो सकते हैं।
  • संग्रहीत प्रक्रियाएं डायनामिक एसक्यूएल निष्पादित कर सकती हैं।
  • संग्रहीत प्रक्रियाओं में त्रुटि प्रबंधन का समर्थन किया जाता है।
  • गैर-निर्धारिती कार्यों का संग्रह संग्रहीत प्रक्रियाओं में किया जा सकता है।
  • उपयोगकर्ता द्वारा परिभाषित कार्यों का चयन कथन में किया जा सकता है।
  • उपयोगकर्ता द्वारा परिभाषित फ़ंक्शंस डिफर्ड नाम समाधान का समर्थन नहीं करते हैं।
  • उपयोगकर्ता परिभाषित कार्यों का आमतौर पर गणना के लिए उपयोग किया जाता है।
  • उपयोगकर्ता द्वारा परिभाषित कार्यों को एक मूल्य वापस करना चाहिए।
  • उपयोगकर्ता परिभाषित फ़ंक्शन छवियों को वापस नहीं कर सकते हैं।
  • उपयोगकर्ता द्वारा परिभाषित फ़ंक्शंस संग्रहीत प्रक्रियाओं की तुलना में इनपुट पैरामीटर की छोटी संख्या स्वीकार करते हैं। यूडीएफ में 1,023 इनपुट पैरामीटर हो सकते हैं।
  • उपयोगकर्ता परिभाषित कार्यों में अस्थायी तालिकाओं का उपयोग नहीं किया जा सकता है।
  • उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन डायनामिक एसक्यूएल निष्पादित नहीं कर सकते हैं।
  • उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन त्रुटि प्रबंधन का समर्थन नहीं करते हैं। RAISEERROR या @@ERROR की अनुमति नहीं है।
  • गैर-निर्धारिती कार्यों का उपयोग यूडीएफ में नहीं किया जा सकता है। उदाहरण के लिए, GETDATE() उपयोग यूडीएफ में नहीं किया जा सकता है।

मूल अंतर

फ़ंक्शन को एक मान वापस करना होगा, लेकिन संग्रहीत प्रक्रिया में यह वैकल्पिक है (प्रक्रिया शून्य या n मान वापस कर सकती है)।

कार्यों के लिए केवल इनपुट पैरामीटर हो सकते हैं जबकि प्रक्रियाओं में इनपुट / आउटपुट पैरामीटर हो सकते हैं।

फ़ंक्शन एक इनपुट पैरामीटर लेता है यह अनिवार्य है लेकिन संग्रहीत प्रक्रिया ओ इनपुट पैरामीटर में ले सकती है ..

कार्य प्रक्रिया से कहा जा सकता है जबकि प्रक्रियाओं को कार्य से नहीं कहा जा सकता है।

अग्रिम अंतर

प्रक्रिया में चयन के साथ-साथ डीएमएल (INSERT / UPDATE / DELETE) कथन भी शामिल है जबकि फ़ंक्शन केवल इसमें चयन कथन की अनुमति देता है।

प्रक्रियाओं को एक चयन कथन में उपयोग नहीं किया जा सकता है जबकि फ़ंक्शन को एक SELECT कथन में एम्बेड किया जा सकता है।

संग्रहीत प्रक्रियाओं का उपयोग कहीं भी WHERE / HAVING / SELECT अनुभाग में SQL कथन में नहीं किया जा सकता है जबकि फ़ंक्शन हो सकता है।

टेबल लौटने वाले कार्यों को एक और पंक्ति के रूप में माना जा सकता है। इसका उपयोग अन्य तालिकाओं के साथ जॉइन में किया जा सकता है।

इनलाइन फ़ंक्शन हालांकि विचारों के रूप में हो सकता है जो पैरामीटर लेते हैं और जॉइन और अन्य रोसेट ऑपरेशंस में उपयोग किए जा सकते हैं।

एक प्रक्रिया में प्रयास-पकड़ ब्लॉक द्वारा अपवाद को संभाला जा सकता है जबकि एक समारोह में ट्राई-कैच ब्लॉक का उपयोग नहीं किया जा सकता है।

हम प्रक्रिया में लेनदेन प्रबंधन के लिए जा सकते हैं जबकि हम समारोह में नहीं जा सकते हैं।

source


संग्रहीत प्रक्रियाओं को स्क्रिप्ट के रूप में उपयोग किया जाता है । वे आपके लिए कमांड की श्रृंखला चलाते हैं और आप उन्हें निश्चित समय पर चलाने के लिए शेड्यूल कर सकते हैं।

कार्य विधियों के रूप में उपयोग किया जाता है। आप इसे कुछ पास करते हैं और यह परिणाम देता है। छोटे और तेज़ होना चाहिए - यह फ्लाई पर करता है।


  • कार्यों का चयन एक चयन कथन में किया जा सकता है जहां प्रक्रियाएं नहीं हो सकती हैं।

  • संग्रहीत प्रक्रिया इनपुट और आउटपुट पैरामीटर दोनों लेती है लेकिन फ़ंक्शन केवल इनपुट पैरामीटर लेते हैं।

  • फ़ंक्शंस टाइप टेक्स्ट, एनटेक्स्ट, इमेज और टाइमस्टैम्प के मान वापस नहीं कर सकते हैं, जहां प्रक्रियाएं हो सकती हैं।

  • कार्य तालिका में उपयोगकर्ता परिभाषित डेटाटाइप के रूप में कार्य का उपयोग किया जा सकता है लेकिन प्रक्रियाएं नहीं कर सकती हैं।

*** उदाहरण: -क्रेट table <tablename>(name varchar(10),salary getsal(name))

यहां होलल एक उपयोगकर्ता परिभाषित फ़ंक्शन है जो एक वेतन प्रकार देता है, जब तालिका बनाई जाती है तो वेतन प्रकार के लिए कोई संग्रहण आवंटित नहीं किया जाता है, और होमल फ़ंक्शन भी निष्पादित नहीं किया जाता है, लेकिन जब हम इस तालिका से कुछ मूल्य प्राप्त कर रहे होते हैं, तो होल फ़ंक्शन निष्पादित हो जाता है और रिटर्न टाइप परिणाम सेट के रूप में वापस कर दिया जाता है।







sql-function