2009-08-19 12 views
7
जांच

मैं एसक्यूएल सर्वर का उपयोग कर रहा संग्रहित प्रक्रियाओं का निर्माण करने के कर्सर कॉलम में कैसे अभिगमन करें, और मैं एक का चयन करें बयानबिना 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; 
+0

आपको कर्सर का उपयोग करने की आवश्यकता क्यों है? आपको सचमुच एसक्यूएल का उपयोग करके सेट आधारित विकल्प को आजमाकर देखना चाहिए क्योंकि यह डाटाबेस प्रोसेसिंग में अच्छा है। अक्सर कर्सर कोड बराबर एसक्यूएल की तुलना में बहुत धीमी है। – pjp

+2

@pjp, कभी-कभी कर्सर पंक्ति-दर-पंक्ति आधार पर कुछ जटिल तर्क चलाने के लिए उपयोगी होते हैं, अक्सर प्रत्येक पंक्ति के लिए संग्रहीत प्रक्रिया को कॉल करके। साथ ही, अगर आपको कुछ मिलियन पंक्तियों को हटाने जैसी कुछ करने की ज़रूरत है, तो एक सेट-आधारित क्वेरी आपके डेटाबेस को लंबे समय तक लॉक कर सकती है। कर्सर के साथ एक समय में एक पंक्ति को हटाने से बहुत अधिक समय लगता है लेकिन यह होने पर डेटाबेस को सांस लेने की अनुमति मिलती है। –

+0

आप एक कर्सर के बिना डेटा लूप और संसाधित कर सकते हैं। आप कर्सर को सेट आधारित संचालन के साथ बदलकर भारी प्रदर्शन सुधार प्राप्त कर सकते हैं। हालांकि, मैंने कर्सर के उपयोग को प्रतिस्थापित कर दिया है, लेकिन अभी भी looped (क्योंकि यह वास्तव में आवश्यक था) और अभी भी बड़े प्रदर्शन लाभ देखा है। –

उत्तर

1

नहीं, आप इसे उस तरह से क्या करना है अगर आप स्थानीय चर में बजाय उन्हें वापस ग्राहक की ओर लौटने की कर्सर से मूल्यों को संग्रहीत करना चाहते हैं।

+0

, वे मानों को दो कॉलम के 1 पंक्ति reslt सेट के रूप में वापस कर रहे हैं –

0

अगर यह अपने पूरे porcedure (ओपी सवाल से दाएं) है:

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; 

तो आप सिर्फ दो कॉलम का एक परिणाम के सेट, कोई कर्सर आवश्यक वापस जाने के लिए निम्न उपाय अपनाते हैं कर सकते हैं:

SELECT top 1 col1, col2 
FROM table; 
संबंधित मुद्दे