मैं काफी समय से फंक्शंस और स्टोर्ड प्रोसीजर सीख रहा हूं, लेकिन मुझे नहीं पता कि क्यों और कब मुझे फंक्शन या स्टोर की गई प्रक्रिया का उपयोग करना चाहिए। वे मेरे लिए एक जैसे दिखते हैं, शायद इसलिए मैं उस बारे में नौसिखिया हूं।
क्या कोई मुझे बताएगा क्यों?
मैं काफी समय से फंक्शंस और स्टोर्ड प्रोसीजर सीख रहा हूं, लेकिन मुझे नहीं पता कि क्यों और कब मुझे फंक्शन या स्टोर की गई प्रक्रिया का उपयोग करना चाहिए। वे मेरे लिए एक जैसे दिखते हैं, शायद इसलिए मैं उस बारे में नौसिखिया हूं।
क्या कोई मुझे बताएगा क्यों?
जवाबों:
कार्य मानों की गणना की जाती है और SQL Server(यानी, कोई INSERTया UPDATEकथन की अनुमति नहीं) के लिए स्थायी पर्यावरणीय परिवर्तन नहीं कर सकते हैं ।
किसी फ़ंक्शन का उपयोग इनलाइन SQLस्टेटमेंट में किया जा सकता है यदि यह एक स्केलर मान लौटाता है या परिणाम सेट पर लौटाया जा सकता है।
टिप्पणियों से ध्यान देने योग्य एक बिंदु, जो उत्तर को संक्षेप में प्रस्तुत करता है। @ शॉन के एंडरसन को धन्यवाद:
फ़ंक्शंस कंप्यूटर-विज्ञान परिभाषा का पालन करते हैं जिसमें वे एक मूल्य वापस करते हैं और वे डेटा को पैरामीटर (तर्क) के रूप में प्राप्त नहीं कर सकते। फ़ंक्शंस को कुछ भी बदलने की अनुमति नहीं है, कम से कम एक पैरामीटर होना चाहिए, और उन्हें एक मूल्य वापस करना होगा। संग्रहीत procs के पास कोई पैरामीटर नहीं है, डेटाबेस ऑब्जेक्ट को बदल सकता है, और मान वापस नहीं करना है।
SQLस्टोर प्रक्रिया से फ़ंक्शन को कैसे कॉल करें और जब हम संग्रहीत कार्यविधि के बजाय फ़ंक्शन का उपयोग करते हैं।
हाय दोस्तों, आज हम चर्चा करेंगे कि कब संग्रहीत प्रक्रिया का उपयोग करना है और कब फ़ंक्शन का उपयोग करना है। साधारण टीम में यदि आप कुछ मानों की गणना करना चाहते हैं और यह एक एकल मान लौटाएगा, तो इसकी आवश्यकता नहीं है:
https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html
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. | |
+---------------------------------+----------------------------------------+
कार्य और संग्रहीत कार्यविधियाँ अलग-अलग उद्देश्यों की पूर्ति करती हैं। यद्यपि यह सबसे अच्छा सादृश्य नहीं है, फ़ंक्शंस को शाब्दिक रूप से किसी भी अन्य फ़ंक्शन के रूप में देखा जा सकता है जिसे आप किसी भी प्रोग्रामिंग भाषा में उपयोग करेंगे, लेकिन संग्रहीत प्रॉक्सेस व्यक्तिगत कार्यक्रमों या बैच स्क्रिप्ट की तरह अधिक हैं।
कार्यों में सामान्य रूप से एक आउटपुट और वैकल्पिक इनपुट होते हैं। आउटपुट को दूसरे फ़ंक्शन के इनपुट के रूप में उपयोग किया जा सकता है (एक 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 ... समाप्त)।
SELECT * from dbo.MyTableValuedFunction()। दूसरी ओर स्प्रोक्स को सीधे ADO.NET के साथ सेट करके बुलाया जा सकता SqlCommand.CommandTypeहै CommandType.StoredProcedure।
संग्रहीत प्रक्रियाओं और उपयोगकर्ता-परिभाषित कार्यों के बीच अंतर:
RAISEERRORया @@ERRORयूडीएफ में अनुमति नहीं है।GETDATE()यूडीएफ में इस्तेमाल नहीं किया जा सकता है।GETDATE()एक समारोह में इस्तेमाल किया जा सकता है। गैर-नियतात्मक पर धुरी एक अच्छा नहीं है।
जब आप गणना करना चाहते हैं और अन्य एसक्यूएल बयानों में उपयोग के लिए एक उपयोगकर्ता-परिभाषित फ़ंक्शन लिखें; जब आप इसके बजाय चाहते हैं तो एक संग्रहीत कार्यविधि लिखें ताकि एसक्यूएल बयानों के संभवतः-जटिल सेट को समूह में रखा जा सके। ये दो बहुत अलग उपयोग के मामले हैं, आखिर!
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.
बुनियादी अंतर
फ़ंक्शन को एक मान वापस करना होगा लेकिन संग्रहित प्रक्रिया में यह वैकल्पिक है (प्रक्रिया शून्य या एन मान लौटा सकती है)।
फ़ंक्शंस में इसके लिए केवल इनपुट पैरामीटर हो सकते हैं जबकि प्रक्रियाओं में इनपुट / आउटपुट पैरामीटर हो सकते हैं।
फ़ंक्शन एक इनपुट पैरामीटर लेता है जो अनिवार्य है, लेकिन संग्रहीत प्रक्रिया में n से लेकर इनपुट पैरामीटर तक ओ हो सकते हैं।
कार्यविधियों को कार्यविधि से बुलाया जा सकता है जबकि कार्यविधियों को कार्य से नहीं बुलाया जा सकता है।
अग्रिम अंतर
कार्यविधि चयन के साथ-साथ DML (INSERT / UPDATE / DELETE) कथन को भी अनुमति देता है जबकि फ़ंक्शन केवल चयन कथन की अनुमति देता है।
प्रक्रियाओं का चयन एक सेलेक्ट स्टेटमेंट में नहीं किया जा सकता है जबकि फंक्शन को सेलेक्ट स्टेटमेंट में एम्बेड किया जा सकता है।
जहाँ कहीं भी फ़ंक्शन हो सकता है, वहां संग्रहीत कार्यविधियाँ SQL कथन में कहीं भी उपयोग नहीं की जा सकती हैं।
कार्य जो रिटर्न टेबल होते हैं, उन्हें एक और पंक्तियों के रूप में माना जा सकता है। यह अन्य तालिकाओं के साथ JOINs में इस्तेमाल किया जा सकता है।
इनलाइन फंक्शन हालांकि उन विचारों के रूप में हो सकता है जो पैरामीटर लेते हैं और इसका उपयोग जॉइन और अन्य रोसेट संचालन में किया जा सकता है।
कार्यविधि में कैच-ब्लॉक को अपवाद द्वारा नियंत्रित किया जा सकता है, जबकि फ़ंक्शन में कैच-ब्लॉक ब्लॉक का उपयोग नहीं किया जा सकता है।
हम प्रक्रिया में लेनदेन प्रबंधन के लिए जा सकते हैं जबकि हम फ़ंक्शन में नहीं जा सकते।
Returnsकीवर्ड के माध्यम से किया जाना चाहिए और एक स्केलर या टेबल प्रकार होना चाहिए) , लेकिन संग्रहीत कार्यविधियाँ वैकल्पिक रूप से वापस आ सकती हैं: क) कथन के Intमाध्यम से 1 प्रकार का परिणाम कोड Returnऔर / या ख) 1+ पैरामीटर (incl। Cursorप्रकार) Outputकीवर्ड के माध्यम से और / या c) 1+ पंक्ति Selectविवरण स्टेटमेंट के माध्यम से । लौटाया जाता है, इसे "इन्सर्ट इनटू" स्टेटमेंट के "एक्जीक्यूट_स्टैटमेंट" तर्क के रूप में इस्तेमाल किया जा सकता है।
उपयोगकर्ता परिभाषित फ़ंक्शन एक महत्वपूर्ण उपकरण है जो एक sql सर्वर प्रोग्रामर के लिए उपलब्ध है। आप एक SQL कथन में इनलाइन का उपयोग कर सकते हैं जैसे
SELECT a, lookupValue(b), c FROM customers
lookupValueयूडीएफ कहां होगा संग्रहीत कार्यविधि का उपयोग करते समय इस तरह की कार्यक्षमता संभव नहीं है। उसी समय आप एक यूडीएफ के अंदर कुछ चीजें नहीं कर सकते। यहाँ याद रखने वाली मूल बात यह है कि UDF की:
एक संग्रहीत प्रक्रिया उन चीजों को कर सकती है।
मेरे लिए एक यूडीएफ का इनलाइन उपयोग एक यूडीएफ का सबसे महत्वपूर्ण उपयोग है।
संग्रहीत कार्यविधियाँ स्क्रिप्ट के रूप में उपयोग की जाती हैं । वे आपके लिए आदेशों की एक श्रृंखला चलाते हैं और आप उन्हें निश्चित समय पर चलाने के लिए शेड्यूल कर सकते हैं। आमतौर पर INSERT, UPDATE, DELETE, इत्यादि जैसे DML कथनों को गुणा करता है या फिर SELECT भी करता है।
तरीकों के रूप में फ़ंक्शंस का उपयोग किया जाता है। आप इसे कुछ पास करते हैं और यह एक परिणाम देता है। छोटा और तेज होना चाहिए - यह मक्खी पर करता है। आमतौर पर एक SELECT स्टेटमेंट में इस्तेमाल किया जाता है।
संग्रहीत प्रक्रिया:
EXECयाEXECUTE बयान ।OUT पैरामीटर का ।समारोह:
केवल रिकॉर्ड का चयन करने के लिए इस्तेमाल किया जा सकता है। हालाँकि, इसे मानक SQL के भीतर से बहुत आसानी से बुलाया जा सकता है, जैसे:
SELECT dbo.functionname('Parameter1')
या
SELECT Name, dbo.Functionname('Parameter1') FROM sysObjectsसरल पुन: प्रयोज्य चयन कार्यों के लिए, फ़ंक्शन कोड को सरल बना सकते हैं। बस JOINअपने कार्यों में खंड का उपयोग करने से सावधान रहें । यदि आपके फ़ंक्शन का एक JOINखंड है और आप इसे किसी अन्य चुनिंदा कथन से कहते हैं, जो कई परिणाम देता है, तो फ़ंक्शन कॉल JOIN
उन तालिकाओं को एक साथ सेट की गई प्रत्येक पंक्ति के लिए परिणाम सेट करेगी । इसलिए हालांकि वे कुछ तर्क को सरल बनाने में सहायक हो सकते हैं, अगर वे ठीक से उपयोग नहीं किए जाते हैं, तो वे एक प्रदर्शन अड़चन भी हो सकते हैं।
OUTपैरामीटर का उपयोग करके मान लौटाता है ।उपयोगकर्ता परिभाषित फ़ंक्शन।
संग्रहीत प्रक्रिया
निम्नलिखित बिंदुओं में क्या मदद मिल सकती है, इसका उपयोग करने के बारे में निर्णय लेने के लिए-
संग्रहीत कार्यविधियाँ एक तालिका चर नहीं लौटा सकतीं जहाँ फ़ंक्शन ऐसा कर सकता है।
सर्वर वातावरण पैरामीटर को बदलने के लिए आप संग्रहीत कार्यविधियों का उपयोग कर सकते हैं जहाँ फ़ंक्शंस का उपयोग नहीं किया जा सकता है।
चियर्स
SQL सर्वर फ़ंक्शन, जैसे कर्सर, आपके अंतिम हथियार के रूप में उपयोग किए जाने के लिए हैं! उनके पास प्रदर्शन के मुद्दे हैं और इसलिए तालिका-मूल्यवान फ़ंक्शन का उपयोग करके जितना संभव हो उतना बचा जाना चाहिए। प्रदर्शन के बारे में बात करते हुए एक मध्यम-वर्ग के हार्डवेयर पर सर्वर पर होस्ट किए गए 1,000,000 से अधिक रिकॉर्ड वाले टेबल के बारे में बात कर रहे हैं; अन्यथा आपको कार्यों के कारण होने वाले प्रदर्शन के बारे में चिंता करने की आवश्यकता नहीं है।
अधिक संदर्भ के लिए देखें: http : //dat डेटाबेस.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html
उन कार्यों से शुरू करें जो एकल मान लौटाते हैं। अच्छी बात यह है कि आप किसी फ़ंक्शन में अक्सर उपयोग किए गए कोड डाल सकते हैं और उन्हें परिणाम सेट में एक कॉलम के रूप में वापस कर सकते हैं।
फिर, आप शहरों की एक मानकीकृत सूची के लिए एक फ़ंक्शन का उपयोग कर सकते हैं। dbo.GetCitiesIn ("एनवाई") वह तालिका लौटाता है जिसे जुड़ने के रूप में उपयोग किया जा सकता है।
यह कोड को व्यवस्थित करने का एक तरीका है। यह जानना कि जब कुछ पुन: प्रयोज्य है और जब यह समय की बर्बादी है तो कुछ केवल परीक्षण और त्रुटि और अनुभव के माध्यम से प्राप्त होता है।
साथ ही SQL Server में फ़ंक्शन एक अच्छा विचार है। वे तेज हैं और काफी शक्तिशाली हो सकते हैं। इनलाइन और प्रत्यक्ष चयन। अति प्रयोग नहीं करने के लिए सावधान।
संग्रहीत प्रक्रियाओं पर कार्यों को प्राथमिकता देने का एक व्यावहारिक कारण यहां है। यदि आपके पास एक संग्रहीत कार्यविधि है जिसे किसी अन्य संग्रहीत कार्यविधि के परिणामों की आवश्यकता है, तो आपको एक सम्मिलित-निष्पादन कथन का उपयोग करना होगा। इसका मतलब यह है कि आपको एक अस्थायी तालिका बनाना होगा और execसंग्रहीत कार्यविधि के परिणामों को अस्थायी तालिका में सम्मिलित करने के लिए एक बयान का उपयोग करना होगा । यह गन्दा है। इसके साथ एक समस्या यह है कि इन्सर्ट-एक्ज़क्यूट्स को नस्ट नहीं किया जा सकता है ।
यदि आप संग्रहीत प्रक्रियाओं के साथ फंस गए हैं जो अन्य संग्रहीत प्रक्रियाओं को कॉल करते हैं, तो आप इसमें भाग ले सकते हैं। यदि नेस्टेड संग्रहित प्रक्रिया केवल एक डेटासेट लौटाती है, तो इसे टेबल-वैल्यू फ़ंक्शन से बदला जा सकता है और आपको यह त्रुटि नहीं मिलेगी।
( यह व्यवसाय तर्क को डेटाबेस से बाहर रखने का एक और कारण है )
कार्यप्रणालियों का चयन चुनिंदा विवरण में किया जा सकता है जहां प्रक्रियाएं नहीं हो सकती हैं।
संग्रहित प्रक्रिया इनपुट और आउटपुट दोनों मापदंडों को लेती है लेकिन फ़ंक्शंस केवल इनपुट मापदंडों को लेती है।
फ़ंक्शंस टाइप टेक्स्ट, नेक्स्ट, इमेज और टाइमस्टैम्प के मूल्यों को वापस नहीं ला सकते जहाँ प्रक्रियाएँ कर सकते हैं।
कार्य तालिका बनाने में उपयोगकर्ता परिभाषित डेटाटाइप्स के रूप में उपयोग किया जा सकता है, लेकिन प्रक्रियाएं नहीं कर सकते हैं।
*** उदाहरण के लिए: -पहले table <tablename>(name varchar(10),salary getsal(name))
यहां गेटल एक यूजर डिफाइन्ड फंक्शन है जो सैलरी टाइप देता है, जब टेबल बनाया जाता है तो सैलरी टाइप के लिए कोई स्टोरेज अलॉट नहीं किया जाता है, और गेटल फंक्शन को एक्जीक्यूट भी नहीं किया जाता है, लेकिन जब हम इस टेबल से कुछ वैल्यू ला रहे होते हैं, तो गेटल फंक्शन हो जाता है और वापसी प्रकार परिणाम सेट के रूप में दिया जाता है।
मुझे लगता है कि यह एक बहुत पुराना प्रश्न है, लेकिन मुझे किसी भी उत्तर में उल्लिखित एक महत्वपूर्ण पहलू दिखाई नहीं देता: क्वेरी योजना में सम्मिलित होना।
कार्य हो सकते हैं ...
अदिश:
CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END
मल्टी-स्टेटमेंट टेबल-वैल्यू:
CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END
इनलाइन तालिका-मूल्यवान:
CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...
तीसरी तरह (इनलाइन टेबल-वैल्यू) को क्वेरी ऑप्टिमाइज़र द्वारा अनिवार्य रूप से (पैराड्राइज्ड) विचारों के रूप में माना जाता है, जिसका अर्थ है कि आपकी क्वेरी से फ़ंक्शन को संदर्भित करना फ़ंक्शन के SQL बॉडी (वास्तव में कॉपी-पेस्टिंग के बिना) को कॉपी-पेस्ट करने के समान है, अग्रणी निम्नलिखित लाभ के लिए:
उपरोक्त संभावित रूप से महत्वपूर्ण प्रदर्शन बचत का कारण बन सकता है, खासकर जब कई स्तरों के कार्यों का संयोजन।
नोट: SQL सर्वर 2019 की तरह लग रहा है स्केलर फ़ंक्शन के कुछ रूप में भी शुरू होगा ।
SQL सर्वर में, फ़ंक्शन और संग्रहीत कार्यविधि दो अलग-अलग प्रकार की इकाइयाँ हैं।
फ़ंक्शन: SQL सर्वर डेटाबेस में, फ़ंक्शन का उपयोग कुछ कार्यों को करने के लिए किया जाता है और कार्रवाई तुरंत परिणाम देती है। कार्य दो प्रकार के होते हैं:
सिस्टम परिभाषित किया गया
उपयोगकर्ता परिभाषित
संग्रहीत कार्यविधियाँ: SQL सर्वर में, संग्रहीत कार्यविधियाँ सर्वर में संग्रहीत की जाती हैं और इसे शून्य, एकल और एकाधिक मान लौटाया जा सकता है। संग्रहीत कार्यविधियाँ दो प्रकार की होती हैं: