SQL सर्वर में फ़ंक्शन बनाम संग्रहीत कार्यविधि


829

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

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





3
कैसे गति के बारे में? जो एक ही क्वेरी तेजी से चलाता है?
अमीनादिमी

जवाबों:


708

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

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

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

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

SQLस्टोर प्रक्रिया से फ़ंक्शन को कैसे कॉल करें और जब हम संग्रहीत कार्यविधि के बजाय फ़ंक्शन का उपयोग करते हैं।

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

https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html


13
मूल रूप से कोई डीएमएल की अनुमति नहीं है?
दाविद ब्लेन

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

23
वास्तव में आप स्थानीय टेबल चर को संशोधित करने के लिए एक समारोह में INSERT, अद्यतन, और DELETE विवरण रख सकते हैं।
ऐनी

14
@ हनी - आप किसी फ़ंक्शन में किसी भी स्थानीय चर को तुरंत बदल सकते हैं और संशोधित कर सकते हैं, हालांकि आप फ़ंक्शन के दायरे के बाहर कुछ भी संशोधित नहीं कर सकते।
MyItchyChin

40
@SeanKAnderson फ़ंक्शन "कम से कम एक पैरामीटर होना चाहिए" सच नहीं है।
लियांग

623

SP और UDF के बीच का अंतर नीचे सूचीबद्ध है:

+---------------------------------+----------------------------------------+
| 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.    |                                        |
+---------------------------------+----------------------------------------+

21
फ़ंक्शंस को एक मान, या एक सेट वापस करना होगा।
रफारेनो

8
यह 3 साल बाद आया लेकिन यह शीर्ष पर होना चाहिए क्योंकि यह पठनीय और व्यापक दोनों है।
डांटे.स्मिथ

एसपी अस्थायी टेबल्स और टेबल चर दोनों का उपयोग कर सकता है जबकि यूडीएफ केवल टेबल चर का उपयोग कर सकता है। बदले में तालिका चर अनुक्रमणिका का उपयोग नहीं कर सकते हैं। UDF को SPSS के विपरीत CROSS APPLY में कहा जा सकता है
लुडोविक ऑबर्ट

190

कार्य और संग्रहीत कार्यविधियाँ अलग-अलग उद्देश्यों की पूर्ति करती हैं। यद्यपि यह सबसे अच्छा सादृश्य नहीं है, फ़ंक्शंस को शाब्दिक रूप से किसी भी अन्य फ़ंक्शन के रूप में देखा जा सकता है जिसे आप किसी भी प्रोग्रामिंग भाषा में उपयोग करेंगे, लेकिन संग्रहीत प्रॉक्सेस व्यक्तिगत कार्यक्रमों या बैच स्क्रिप्ट की तरह अधिक हैं।

कार्यों में सामान्य रूप से एक आउटपुट और वैकल्पिक इनपुट होते हैं। आउटपुट को दूसरे फ़ंक्शन के इनपुट के रूप में उपयोग किया जा सकता है (एक SQL सर्वर अंतर्निहित जैसे कि DatedIFF, LEN, आदि) या SQL क्वेरी के लिए एक विधेय के रूप में - जैसे, SELECT a, b, dbo.MyFunction(c) FROM tableया SELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)

संग्रहीत प्रॉक्सेस का उपयोग SQL क्वेरीज़ को लेन-देन में एक साथ बांधने के लिए किया जाता है, और बाहरी दुनिया के साथ इंटरफ़ेस के लिए। फ्रेमवर्क जैसे ADO.NET, आदि किसी फ़ंक्शन को सीधे कॉल नहीं कर सकते हैं, लेकिन वे सीधे संग्रहीत संग्रह को कॉल कर सकते हैं।

फ़ंक्शंस में एक छिपा हुआ ख़तरा होता है: उनका दुरुपयोग किया जा सकता है और इसके बजाय खराब प्रदर्शन के मुद्दे हो सकते हैं: इस प्रश्न पर विचार करें:

SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)

जहां MyFunction के रूप में घोषित किया गया है:

CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
   DECLARE @retval INTEGER

   SELECT localValue 
      FROM dbo.localToNationalMapTable
      WHERE nationalValue = @someValue

   RETURN @retval
END

यहाँ क्या होता है कि फ़ंक्शन MyFunction को MyTable तालिका में प्रत्येक पंक्ति के लिए कहा जाता है। यदि MyTable की 1000 पंक्तियाँ हैं, तो यह डेटाबेस के विरुद्ध एक और 1000 तदर्थ क्वेरी है। इसी तरह, यदि स्तंभ कल्पना में निर्दिष्ट किए जाने पर फ़ंक्शन को कॉल किया जाता है, तो फ़ंक्शन को SELECT द्वारा लौटाए गए प्रत्येक पंक्ति के लिए कॉल किया जाएगा।

इसलिए आपको सावधानीपूर्वक लेखन कार्य करने की आवश्यकता है। यदि आप किसी फंक्शन में टेबल से सेलेक्ट करते हैं, तो आपको खुद से पूछना होगा कि क्या माता-पिता द्वारा संग्रहित खरीद में जॉय के साथ बेहतर प्रदर्शन किया जा सकता है या कुछ अन्य SQL कंस्ट्रक्शन (जैसे CASE ... WHEN ... ELSE ... समाप्त)।


2
क्या आप कृपया "फ्रेमवर्क जैसे ADO.NET, इत्यादि को सीधे फंक्शन नहीं कह सकते" पर विस्तार से बता सकते हैं? मैंने ADO.NET डेटा प्रदाताओं के साथ कोई समस्या नहीं के साथ कार्य निष्पादित किए हैं।
इयान केम्प

24
आपको कुछ सेलेक्ट स्टेटमेंट के माध्यम से एक फ़ंक्शन को कॉल करना होगा - एक फ़ंक्शन को अपने आप में कोड का एक स्वतंत्र टुकड़ा नहीं कहा जा सकता है - इसे कुछ बड़े एसक्यूएल स्टेटमेंट के हिस्से के रूप में बुलाया जाना है, भले ही वह एसक्यूएल स्टेटमेंट कुछ और न हो की तुलना में SELECT * from dbo.MyTableValuedFunction()। दूसरी ओर स्प्रोक्स को सीधे ADO.NET के साथ सेट करके बुलाया जा सकता SqlCommand.CommandTypeहै CommandType.StoredProcedure
क्रिस जे

60

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

  • संग्रहित प्रक्रियाओं का चयन बयानों में नहीं किया जा सकता है।
  • संग्रहीत कार्यविधियाँ आस्थगित नाम समाधान का समर्थन करती हैं।
  • संग्रहीत कार्यविधियाँ आमतौर पर व्यावसायिक तर्क प्रदर्शन के लिए उपयोग की जाती हैं।
  • संग्रहीत प्रक्रियाएं किसी भी डेटाटाइप को वापस कर सकती हैं।
  • उपयोगकर्ता निर्धारित कार्यों की तुलना में संग्रहीत प्रक्रियाएं इनपुट पैरामीटर की अधिक संख्या को स्वीकार कर सकती हैं। संग्रहीत प्रक्रियाओं में 21,000 इनपुट पैरामीटर हो सकते हैं।
  • संग्रहीत कार्यविधियाँ डायनेमिक SQL निष्पादित कर सकती हैं।
  • संग्रहीत कार्यविधियाँ त्रुटि से निपटने में सहायता करती हैं।
  • गैर-नियतात्मक कार्यों का उपयोग संग्रहीत प्रक्रियाओं में किया जा सकता है।

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

1
नीचे @curiousBoy को उद्धृत करने के लिए। एक और अ-साक्षित जवाब (@Ankit द्वारा) (<- देखें कि मैंने ऐसा कैसे किया?)): "आपको स्रोत संदर्भ देना चाहिए था। यह ( blogs.msdn.microsoft.com/pradeepsvs/2014/10 से है) / 08 /… )। कृपया उस काम का सम्मान करें जो दूसरे करते हैं! "
टॉम

7
यह ब्लॉग 8 अक्टूबर 2014 से लिखा गया था और यह उत्तर 2 मई, 2013 को लिखा गया था @Tom
कुमार मनीष

1
@ कोड सवार: आह, मेरी क्षमायाचना! विश्वास नहीं कर सकता है कि मैं ध्यान नहीं दिया! तो, ब्लॉग ने आपको (या किसी और को) जो बिना क्रेडिट के कॉपी किया था?
टॉम

GETDATE()एक समारोह में इस्तेमाल किया जा सकता है। गैर-नियतात्मक पर धुरी एक अच्छा नहीं है।
प्रदर्शन

56

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


18
उपयोगकर्ता-परिभाषित कार्यों के विभिन्न प्रकार हैं। स्केलर वाले केवल मान लौटाते हैं; अन्य प्रकार के परिणाम परिणाम सेट करता है।
एके

44
              STORE PROCEDURE                 FUNCTION (USER DEFINED FUNCTION)    
 * Procedure can return 0, single or   | * Function can return only single value   
   multiple values.                    |
                                       |
 * Procedure can have input, output    | * Function  can have only input 
   parameters.                         |   parameters.         
                                       |
 * Procedure cannot be called from     | * Functions can be called from 
   function.                           |   procedure.
                                       |
 * Procedure allows select as well as  | * Function allows only select statement 
   DML statement in it.                |   in it.
                                       |
 * Exception can be handled by         | * Try-catch block cannot be used in a 
   try-catch block in a procedure.     |   function.
                                       |
 * We can go for transaction management| * We can't go for transaction 
   in procedure.                       |   management in function.
                                       |
 * Procedure cannot be utilized in a   | * Function can be embedded in a select 
   select statement                    |   statement.
                                       |
 * Procedure can affect the state      | * Function can not affect the state 
   of database means it can perform    |   of database means it can not    
   CRUD operation on database.         |   perform CRUD operation on 
                                       |   database. 
                                       |
 * Procedure can use temporary tables. | * Function can not use 
                                       |   temporary tables. 
                                       |
 * Procedure can alter the server      | * Function can not alter the  
   environment parameters.             |   environment parameters.
                                       |   
 * Procedure can use when we want      | * Function can use when we want
   instead is to group a possibly-     |   to compute and return a value
   complex set of SQL statements.      |   for use in other SQL 
                                       |   statements.

1
UDF को सपा
लुडोविक ऑबर्ट

24

बुनियादी अंतर

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

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

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

कार्यविधियों को कार्यविधि से बुलाया जा सकता है जबकि कार्यविधियों को कार्य से नहीं बुलाया जा सकता है।

अग्रिम अंतर

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

प्रक्रियाओं का चयन एक सेलेक्ट स्टेटमेंट में नहीं किया जा सकता है जबकि फंक्शन को सेलेक्ट स्टेटमेंट में एम्बेड किया जा सकता है।

जहाँ कहीं भी फ़ंक्शन हो सकता है, वहां संग्रहीत कार्यविधियाँ SQL कथन में कहीं भी उपयोग नहीं की जा सकती हैं।

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

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

कार्यविधि में कैच-ब्लॉक को अपवाद द्वारा नियंत्रित किया जा सकता है, जबकि फ़ंक्शन में कैच-ब्लॉक ब्लॉक का उपयोग नहीं किया जा सकता है।

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

स्रोत


25
आपको स्रोत का संदर्भ देना चाहिए था। यह dotnet-tricks.com/Tutorial/sqlserver/… से है । कृपया उस कार्य का सम्मान करें जो अन्य करते हैं!
जिज्ञासुबॉय

16
यह एक स्रोत का संदर्भ नहीं देने का कारण नहीं है। आप इसके अंत में उल्लेख कर सकते हैं!
जिज्ञासुबॉय

2
पुन। "फ़ंक्शन को एक मान वापस करना चाहिए, लेकिन संग्रहीत कार्यविधि में यह वैकल्पिक है ....": मैं स्पष्ट करूंगा कि: "फ़ंक्शंस को एक और केवल एक मान वापस करना चाहिए (जो Returnsकीवर्ड के माध्यम से किया जाना चाहिए और एक स्केलर या टेबल प्रकार होना चाहिए) , लेकिन संग्रहीत कार्यविधियाँ वैकल्पिक रूप से वापस आ सकती हैं: क) कथन के Intमाध्यम से 1 प्रकार का परिणाम कोड Returnऔर / या ख) 1+ पैरामीटर (incl। Cursorप्रकार) Outputकीवर्ड के माध्यम से और / या c) 1+ पंक्ति Selectविवरण स्टेटमेंट के माध्यम से । लौटाया जाता है, इसे "इन्सर्ट इनटू" स्टेटमेंट के "एक्जीक्यूट_स्टैटमेंट" तर्क के रूप में इस्तेमाल किया जा सकता है।
टॉम

20

उपयोगकर्ता परिभाषित फ़ंक्शन एक महत्वपूर्ण उपकरण है जो एक sql सर्वर प्रोग्रामर के लिए उपलब्ध है। आप एक SQL कथन में इनलाइन का उपयोग कर सकते हैं जैसे

SELECT a, lookupValue(b), c FROM customers 

lookupValueयूडीएफ कहां होगा संग्रहीत कार्यविधि का उपयोग करते समय इस तरह की कार्यक्षमता संभव नहीं है। उसी समय आप एक यूडीएफ के अंदर कुछ चीजें नहीं कर सकते। यहाँ याद रखने वाली मूल बात यह है कि UDF की:

  • स्थायी परिवर्तन नहीं बना सकते
  • डेटा नहीं बदल सकते

एक संग्रहीत प्रक्रिया उन चीजों को कर सकती है।

मेरे लिए एक यूडीएफ का इनलाइन उपयोग एक यूडीएफ का सबसे महत्वपूर्ण उपयोग है।


14

संग्रहीत कार्यविधियाँ स्क्रिप्ट के रूप में उपयोग की जाती हैं । वे आपके लिए आदेशों की एक श्रृंखला चलाते हैं और आप उन्हें निश्चित समय पर चलाने के लिए शेड्यूल कर सकते हैं। आमतौर पर INSERT, UPDATE, DELETE, इत्यादि जैसे DML कथनों को गुणा करता है या फिर SELECT भी करता है।

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


2
यह उनके बारे में सोचने का त्वरित और गंदा तरीका है।
एरिक बिशार्ड

2
वास्तव में एक अच्छा सारांश। अन्य उत्तर दो के सैद्धांतिक अंतर पर ध्यान केंद्रित करते हैं, जबकि अभी भी मुझे इस बात का ध्यान नहीं है कि व्यवहार में किसका उपयोग करना है।
jf328

8

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

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

समारोह:

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

    SELECT dbo.functionname('Parameter1')

    या

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

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

8

उपयोगकर्ता परिभाषित फ़ंक्शन।

  1. फ़ंक्शन को एक मान वापस करना होगा।
  2. केवल चुनिंदा बयानों की अनुमति देगा, यह हमें डीएमएल बयानों का उपयोग करने की अनुमति नहीं देगा।
  3. यह केवल इनपुट मापदंडों की अनुमति देगा, आउटपुट मापदंडों का समर्थन नहीं करता है।
  4. यह हमें try-catch ब्लॉकों का उपयोग करने की अनुमति नहीं देगा।
  5. कार्यों के भीतर लेनदेन की अनुमति नहीं है।
  6. हम केवल तालिका चर का उपयोग कर सकते हैं, यह अस्थायी तालिकाओं का उपयोग करने की अनुमति नहीं देगा।
  7. एक प्रक्रिया से संग्रहीत कार्यविधियाँ नहीं बुलाई जा सकतीं।
  8. कार्यों को चुनिंदा कथन से बुलाया जा सकता है।
  9. परिणाम सेट के रूप में यूडीएफ को क्लॉज में शामिल किया जा सकता है।

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

  1. संग्रहीत प्रक्रिया मान वापस कर सकती है या नहीं।
  2. चयन के साथ-साथ डीएमएल स्टेटमेंट जैसे इंसर्ट, अपडेट, डिलीट वगैरह का चयन कर सकते हैं
  3. इसमें इनपुट और आउटपुट दोनों पैरामीटर हो सकते हैं।
  4. अपवाद हैंडलिंग के लिए हम कोशिश कर सकते हैं पकड़ने के ब्लॉक का उपयोग करें।
  5. संग्रहीत कार्यविधियों के भीतर लेनदेन का उपयोग कर सकते हैं।
  6. इसमें टेबल टेबल के साथ-साथ अस्थायी टेबल दोनों का उपयोग कर सकते हैं।
  7. संग्रहीत कार्यविधियाँ कॉल कर सकती हैं।
  8. प्रक्रियाओं को चयन / जहां / बयानों और इतने पर से नहीं बुलाया जा सकता है। Execute / Exec स्टेटमेंट का उपयोग Stored Procedure को कॉल / निष्पादित करने के लिए किया जा सकता है।
  9. प्रक्रियाओं का उपयोग जॉइन क्लॉज में नहीं किया जा सकता है

6

निम्नलिखित बिंदुओं में क्या मदद मिल सकती है, इसका उपयोग करने के बारे में निर्णय लेने के लिए-

  1. संग्रहीत कार्यविधियाँ एक तालिका चर नहीं लौटा सकतीं जहाँ फ़ंक्शन ऐसा कर सकता है।

  2. सर्वर वातावरण पैरामीटर को बदलने के लिए आप संग्रहीत कार्यविधियों का उपयोग कर सकते हैं जहाँ फ़ंक्शंस का उपयोग नहीं किया जा सकता है।

चियर्स


6

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

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

अधिक संदर्भ के लिए देखें: http : //dat डेटाबेस.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html


1
धन्यवाद। एक कॉलम के लिए मानों को पॉप्युलेट करने के लिए क्वेरी के भीतर कॉल करने के लिए आज एक फंक्शन लिखा। इससे पहले कि मैं इसे रोकता, 3 मिनट से अधिक समय तक प्रदर्शन चला। यह करने के लिए एक तरह से पता लगाया। 15 सेकंड में निष्पादित समाप्त। (डेटा सेट 3456 पंक्तियाँ थीं)। बड़ा प्रदर्शन अलग।
18

संपादित करें: 15 और 50 सेकंड के बीच का निष्पादन समाप्त होता है, जिसके आधार पर मैं "ORDER BY" (डेटा सेट 3456 पंक्तियों के आधार पर) था। बड़ा प्रदर्शन अंतर।
विस्कोस

प्रदर्शन अंतर में उन स्तंभों के विभिन्न प्रकार हो सकते हैं जिनके द्वारा आप परिणाम का आदेश दे रहे हैं। SQL सर्वर वर्ण डेटा की तुलना में संख्या के साथ बहुत बेहतर काम करता है। आप उस 50secs क्वेरी पर DTA का उपयोग कर सकते हैं और देख सकते हैं कि क्वेरी को थोड़ा तेज़ करने के लिए यह किसी प्रकार के आँकड़े / अनुक्रमणिका सुझावों के साथ आ सकता है या नहीं।
Achilles

1
मुझे यकीन नहीं है कि यह कहने के लिए पर्याप्त सबूत प्रदान किए गए हैं कि यह अंतिम उपाय होना चाहिए। आप एक फ़ंक्शन को एक पैरामीटर दृश्य के रूप में सोच सकते हैं जिसे आगे संचालित किया जा सकता है। उदाहरण के लिए, आप ग्राहकों को ऑर्डर में शामिल होना चाहते हैं, लेकिन केवल मचिगन के लिए। आप एक customerOrders (@StateCode) फ़ंक्शन बनाते हैं जो केवल एक ही राज्य के ग्राहक के मूल्य में शामिल होगा। फिर, मैं इस सेट पर आगे FirstName, LastName, OrderTotal, StoreName From CustomerOrders ('MI') INNER JOIN Stores ON Stores.StoreID = Orders.StoreID WHO OrderTotal> 100 के रूप में संचालित कर सकता हूं; यह एसपी के साथ एक दर्द होगा क्योंकि आपको नकल करनी चाहिए।
MPavlak

उस तालिका में आपके कितने रिकॉर्ड हैं? यदि आपका हार्डवेयर इसे ठीक से संभालता है, तो आपको हथियार चुनने के बारे में चिंता करने की आवश्यकता नहीं होगी। एक चम्मच काम कर सकता है जब यह एक तलवार को तोड़ने के लिए पर्याप्त कठिन होता है; इस कठोरता को हार्डवेयर कहा जाता है!
अकिलीज

3

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

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

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

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


3

संग्रहीत प्रक्रियाओं पर कार्यों को प्राथमिकता देने का एक व्यावहारिक कारण यहां है। यदि आपके पास एक संग्रहीत कार्यविधि है जिसे किसी अन्य संग्रहीत कार्यविधि के परिणामों की आवश्यकता है, तो आपको एक सम्मिलित-निष्पादन कथन का उपयोग करना होगा। इसका मतलब यह है कि आपको एक अस्थायी तालिका बनाना होगा और execसंग्रहीत कार्यविधि के परिणामों को अस्थायी तालिका में सम्मिलित करने के लिए एक बयान का उपयोग करना होगा । यह गन्दा है। इसके साथ एक समस्या यह है कि इन्सर्ट-एक्ज़क्यूट्स को नस्ट नहीं किया जा सकता है

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

( यह व्यवसाय तर्क को डेटाबेस से बाहर रखने का एक और कारण है )


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

1
  • कार्यप्रणालियों का चयन चुनिंदा विवरण में किया जा सकता है जहां प्रक्रियाएं नहीं हो सकती हैं।

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

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

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

*** उदाहरण के लिए: -पहले table <tablename>(name varchar(10),salary getsal(name))

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


1

मुझे लगता है कि यह एक बहुत पुराना प्रश्न है, लेकिन मुझे किसी भी उत्तर में उल्लिखित एक महत्वपूर्ण पहलू दिखाई नहीं देता: क्वेरी योजना में सम्मिलित होना।

कार्य हो सकते हैं ...

  1. अदिश:

    CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END

  2. मल्टी-स्टेटमेंट टेबल-वैल्यू:

    CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END

  3. इनलाइन तालिका-मूल्यवान:

    CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...

तीसरी तरह (इनलाइन टेबल-वैल्यू) को क्वेरी ऑप्टिमाइज़र द्वारा अनिवार्य रूप से (पैराड्राइज्ड) विचारों के रूप में माना जाता है, जिसका अर्थ है कि आपकी क्वेरी से फ़ंक्शन को संदर्भित करना फ़ंक्शन के SQL बॉडी (वास्तव में कॉपी-पेस्टिंग के बिना) को कॉपी-पेस्ट करने के समान है, अग्रणी निम्नलिखित लाभ के लिए:

  • क्वेरी प्लानर इनलाइन फ़ंक्शन के निष्पादन का अनुकूलन कर सकता है, जैसे कि यह किसी भी अन्य उप-क्वेरी (जैसे अप्रयुक्त स्तंभों को समाप्त करता है, नीचे की ओर पुश करता है, विभिन्न JOIN रणनीतियों को चुन सकता है)।
  • कई इनलाइन फ़ंक्शन को संयोजित करने से पहले अगले को खिलाने से पहले परिणाम को भौतिक बनाने की आवश्यकता नहीं होती है।

उपरोक्त संभावित रूप से महत्वपूर्ण प्रदर्शन बचत का कारण बन सकता है, खासकर जब कई स्तरों के कार्यों का संयोजन।


नोट: SQL सर्वर 2019 की तरह लग रहा है स्केलर फ़ंक्शन के कुछ रूप में भी शुरू होगा ।


-2

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

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

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

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

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

  1. सिस्टम संग्रहीत कार्यविधियाँ
  2. उपयोगकर्ता परिभाषित प्रक्रियाएँ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.