2010-11-22 15 views
7

T-SQL में एक कर्सर को दो तरह से घोषित किया जा सकता (है कि मैं के बारे में पता):लाभ (@cn कर्सर घोषित)

  1. declare CursorName cursor for ...
  2. declare @CursorName cursor

मैं कुछ परीक्षण चला रहा था और मुझे पता चला कि एक कर्सर चर का निर्माण sp_cursor_list के परिणाम में कोई प्रविष्टि नहीं जोड़ देगा।

प्रदर्शन, संसाधन उपयोग आदि के दृष्टिकोण से दूसरे दृष्टिकोण का उपयोग करने पर कोई लाभ/हानि है?

पीएस: मुझे संभावित कर्सर प्रदर्शन के मुद्दों के बारे में पता है। मैं कर्सर बनाम सेट पर आधारित तुलना करने के लिए नहीं कह रहा हूं। या कर्सर बनाम while temp/table variable के साथ।

+3

यदि प्रदर्शन एक विचार है, तो आप शायद का उपयोग नहीं किया जाना चाहिए :) – JNK

+0

यदि आप कोड या एक्सएमएल पोस्ट करते हैं, ** कृपया ** टेक्स्ट एडिटर में उन पंक्तियों को हाइलाइट करें और संपादक टूलबार पर "कोड" बटन (101 010) पर क्लिक करें ताकि इसे अच्छी तरह प्रारूपित किया जा सके और इसे हाइलाइट किया जा सके! –

+1

यदि आपको ** कर्सर का उपयोग करना होगा, तो मैं हमेशा 'DECLARE कर्सर_नाम CURSOR FAST_FORWARD' का उपयोग करने का प्रयास करता हूं यदि मैं कभी भी कर सकता हूं। लेकिन यदि संभव हो तो कर्सर से बचने के लिए आपका सबसे अच्छा प्रदर्शन अनुकूलन वास्तव में होगा। –

उत्तर

4

जो मैंने पढ़ा है उससे कर्सर वैरिएबल का उद्देश्य इसे संग्रहीत प्रो में आउटपुट चर के रूप में उपयोग करने में सक्षम होना है, इस प्रकार आप कर्सर में डेटा को अन्य नियंत्रण प्रो में भेज सकते हैं। मैंने यह कोशिश नहीं की है इसलिए मुझे नहीं पता कि यह कैसे काम करेगा, लेकिन मुझे पुस्तकें ऑनलाइन पढ़ने से मिलता है। मुझे आश्चर्य होगा कि क्या कोई मापनीय प्रदर्शन अंतर है और निश्चित रूप से वह सुधार नहीं है जिसे आप पहले स्थान पर कर्सर का उपयोग न करके प्राप्त कर सकते हैं। यदि आप इसे आउटपुट वैरिएबल के रूप में उपयोग करने की योजना नहीं बना रहे हैं, तो मैं सुझाव दूंगा कि अधिक सामान्य कर्सर definiton के साथ रहने से कोड को बनाए रखना आसान हो सकता है।

उस ने कहा, बहुत कम मामले हैं जहां एक कर्सर वास्तव में आवश्यक है।

0

मैं जितना संभव हो कर्सर से बचने की कोशिश करता हूं (कम से कम यदि आप प्रदर्शन के बारे में सोचते हैं)। अपनी समस्या के लिए सेट आधारित समाधान बनाने का प्रयास करें। एक कर्सर आधारित समाधान के बाद आमतौर पर उन्हें अधिक तेज़ी से संसाधित किया जाएगा।

+1

जबकि मैं सहमत हूं, यह वास्तव में उनके प्रश्न को संबोधित नहीं कर रहा है। – JNK

4

DECLARE @local_variable CURSOR सिंटैक्स का उपयोग करने का एक और फायदा है जिसे मैंने अभी खोजा है।

लाभ तब होता है जब एक संग्रहीत प्रक्रिया दूसरे को कॉल करती है, और दोनों प्रक्रियाओं में कर्सर एक ही समय में खुलते हैं। नाम 'cursor_name' के साथ एक कर्सर पहले से मौजूद है: DECLARE cursor_name CURSOR कर्सर को परिभाषित करने के लिए दोनों प्रक्रियाओं एक ही cursor_name का उपयोग किया जाता है, और है, तो आप

संदेश 16915 मिलता है।

दूसरी ओर, DECLARE @local_variable CURSOR माता-पिता और बच्चे संग्रहित प्रक्रियाओं में कर्सर को परिभाषित करने के लिए प्रयोग किया जाता है, तो @local_variable प्रत्येक प्रक्रिया के लिए स्थानीय है और कोई विरोध नहीं है। जो लोग इस विधि से पहले इस्तेमाल नहीं किया है के लिए, यहाँ एक उदाहरण है, स्थानीय चर के रूप में @C का उपयोग कर:

DECLARE @C AS CURSOR; 

SET @C = CURSOR FOR SELECT ...; 

OPEN @C; 

FETCH NEXT FROM @C INTO ...; 

...

कर्सर
संबंधित मुद्दे