मैं एसक्यूएल सर्वर का उपयोग कर रहा संग्रहित प्रक्रियाओं का निर्माण करने के कर्सर कॉलम में कैसे अभिगमन करें, और मैं एक का चयन करें बयानबिना FETCH ..
मैं पालन कर्सर को परिभाषित कर रहा हूँ लूप करने के लिए कर्सर का उपयोग कर रहा:
DECLARE @c_col1 varchar(max);
DECLARE @c_col2 varchar(max);
DECLARE c as CURSOR FOR
SELECT col1, col2
FROM table;
OPEN c;
FETCH NEXT FROM c INTO
@c_col1, @c_col2;
SELECT @c_col1, @c_col2;
क्या प्रत्येक कॉलम के लिए चर घोषित करने और FETCH क्लॉज में INTO का उपयोग करने के बिना कर्सर के कॉलम तक पहुंचने का कोई तरीका है? दूसरे शब्दों में, यह संभव उपयोग करने के लिए है:
DECLARE c as CURSOR FOR
SELECT col1, col2
FROM table;
OPEN c;
FETCH NEXT FROM c;
SELECT c.col1, c.col2;
आपको कर्सर का उपयोग करने की आवश्यकता क्यों है? आपको सचमुच एसक्यूएल का उपयोग करके सेट आधारित विकल्प को आजमाकर देखना चाहिए क्योंकि यह डाटाबेस प्रोसेसिंग में अच्छा है। अक्सर कर्सर कोड बराबर एसक्यूएल की तुलना में बहुत धीमी है। – pjp
@pjp, कभी-कभी कर्सर पंक्ति-दर-पंक्ति आधार पर कुछ जटिल तर्क चलाने के लिए उपयोगी होते हैं, अक्सर प्रत्येक पंक्ति के लिए संग्रहीत प्रक्रिया को कॉल करके। साथ ही, अगर आपको कुछ मिलियन पंक्तियों को हटाने जैसी कुछ करने की ज़रूरत है, तो एक सेट-आधारित क्वेरी आपके डेटाबेस को लंबे समय तक लॉक कर सकती है। कर्सर के साथ एक समय में एक पंक्ति को हटाने से बहुत अधिक समय लगता है लेकिन यह होने पर डेटाबेस को सांस लेने की अनुमति मिलती है। –
आप एक कर्सर के बिना डेटा लूप और संसाधित कर सकते हैं। आप कर्सर को सेट आधारित संचालन के साथ बदलकर भारी प्रदर्शन सुधार प्राप्त कर सकते हैं। हालांकि, मैंने कर्सर के उपयोग को प्रतिस्थापित कर दिया है, लेकिन अभी भी looped (क्योंकि यह वास्तव में आवश्यक था) और अभी भी बड़े प्रदर्शन लाभ देखा है। –