कार्य और संग्रहीत कार्यविधियाँ अलग-अलग उद्देश्यों की पूर्ति करती हैं। यद्यपि यह सबसे अच्छा सादृश्य नहीं है, फ़ंक्शंस को शाब्दिक रूप से किसी भी अन्य फ़ंक्शन के रूप में देखा जा सकता है जिसे आप किसी भी प्रोग्रामिंग भाषा में उपयोग करेंगे, लेकिन संग्रहीत प्रॉक्सेस व्यक्तिगत कार्यक्रमों या बैच स्क्रिप्ट की तरह अधिक हैं।
कार्यों में सामान्य रूप से एक आउटपुट और वैकल्पिक इनपुट होते हैं। आउटपुट को दूसरे फ़ंक्शन के इनपुट के रूप में उपयोग किया जा सकता है (एक 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 ... समाप्त)।