ऐसा करने के कोई अच्छे तरीके नहीं हैं। यह संग्रहीत प्रक्रियाओं की एक सीमा है। आपके विकल्प हैं:
-
प्रक्रिया को उपयोगकर्ता परिभाषित फ़ंक्शन पर स्विच करें . पूरी दुनिया में, आज, लोग संग्रहित प्रक्रियाएं बना रहे हैं जो कार्य होनी चाहिए। यह एक शिक्षा का मुद्दा है। आप स्थिति एक अच्छा उदाहरण है क्यों। यदि आपकी प्रक्रिया इसके बजाय एक यूडीएफ थी, तो आप निम्न कार्य कर सकते थे, ठीक वैसे ही जैसे आप सहज रूप से सोचते हैं कि आपको सक्षम होना चाहिए:
SELECT * FROM udf_who2() WHERE login='bmccormack'
-
यदि आप वास्तव में अपनी प्रक्रिया को नहीं छू सकते हैं, और जरूरी यह एसक्यूएल में किया है, तो आपको फंकी होना होगा। अपनी मूल प्रक्रिया को लपेटने के लिए एक और संग्रहित प्रक्रिया बनाएं। अपनी नई प्रक्रिया के अंदर अपनी मौजूदा प्रक्रिया को कॉल करें और मानों को एक अस्थायी तालिका में रखें, फिर उस तालिका के विरुद्ध आपके इच्छित फ़िल्टर के साथ एक क्वेरी चलाएं, और उस परिणाम को बाहरी दुनिया में वापस कर दें।
SQL सर्वर 2005 से शुरू होकर, उपयोगकर्ता परिभाषित कार्य हैं कि आप डेटा पुनर्प्राप्ति को कैसे समाहित करते हैं। दृश्यों के साथ संग्रहीत कार्यविधियाँ, विशेष परिस्थितियों में उपयोग करने के लिए विशेष उपकरण हैं। वे दोनों सही समय पर बहुत काम आते हैं, लेकिन पहली पसंद नहीं हैं। कुछ लोग सोच सकते हैं कि उपरोक्त उदाहरण (ए) फ़ंक्शन के सभी परिणाम प्राप्त करता है और फिर (बी) उस परिणाम पर फ़िल्टर करता है, जैसे सबक्वायरी। ऐसा नहीं है . SQL सर्वर 2005+ उस क्वेरी को ऑप्टिमाइज़ करता है; अगर login
. पर कोई अनुक्रमणिका है , आप क्वेरी निष्पादन योजना में तालिका स्कैन नहीं देखते हैं; बहुत कुशल।
संपादित करें :मुझे यह जोड़ना चाहिए कि एक यूडीएफ की पारी एक एसपी के समान होती है। अगर यह तर्क . के साथ खिलवाड़ कर रहा है जिस एसपी से आप बचना चाहते हैं, आप उसे अभी भी एक फ़ंक्शन में बदल सकते हैं। कई बार मैंने बड़ी, डरावनी प्रक्रिया कोड लिया है जिसे मैं समझना नहीं चाहता था, और इसे सफलतापूर्वक एक समारोह में स्थानांतरित कर दिया। एकमात्र समस्या तब होगी जब प्रक्रिया संशोधित . होगी परिणाम लौटने के अलावा कुछ भी; यूडीएफ डीबी में डेटा को संशोधित नहीं कर सकते हैं।