2011-03-01 15 views
8

मैं कर्सर का उपयोग कर रहा हूं।टीएसक्यूएल कर्सर परिभाषा बदलें

DECLARE @column1 NVARCHAR(MAX); 

DECLARE cursor_name CURSOR FOR 
    SELECT c1 
    FROM table_name; 

OPEN cursor_name; 
FETCH cursor_name INTO @column1; 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    FETCH cursor_name INTO @column1; 
END 

CLOSE cursor_name; 
DEALLOCATE cursor_name; 

अब मेरी सवाल है, मैं इसे उपयोग करने के बाद कर्सर cursor_name की परिभाषा को बदल सकते हैं? मैं करने के लिए कुछ इसी तरह मतलब है:

DECLARE cursor_name CURSOR FOR 
    SELECT c2 
    FROM table_name2; 

ही कर्सर नाम cursor_name का उपयोग करना, लेकिन defination बदल जाता है। यदि यह संभव है, तो यह कैसे करें?

धन्यवाद।

उत्तर

10

Yes it's possible, लेकिन इसे आपके डीलॉकेट के बाद होना चाहिए। क्या आपने यह कोशिश की है और यह काम नहीं कर रहा है या कुछ?

आप यह भी देखना चाहेंगे कि आपको वास्तव में कर्सर की आवश्यकता है या नहीं। उन्होंने प्रदर्शन को नुकसान पहुंचाया और एसक्यूएल जो उनका उपयोग करता है उन्हें अक्सर उनके बिना फिर से लिखा जा सकता है।

this article पर एक नज़र डालें जो इसे कैसे करें इस पर निर्भर करता है। वे एक कर्सर घोषित करने के लिए कम आम डेक्लेयर/एसईटी वाक्यविन्यास का उपयोग करते हैं (कम से कम मेरी दुनिया में असामान्य)। अबे Miessler कर्सर प्रदर्शन के बारे में टिप्पणी को गुमराह करने के लिए

USE pubs 
GO 
DECLARE @MyCursor CURSOR 
SET @MyCursor = CURSOR LOCAL SCROLL FOR 
SELECT * FROM titles 

DEALLOCATE @MyCursor 

SET @MyCursor = CURSOR LOCAL SCROLL FOR 
SELECT * FROM sales 
GO 
4

एक कर्सर बंद होने और अस्वीकार करने के बाद, एक पूरी तरह तकनीकी दृष्टि से, कर्सर आवश्यक है या नहीं, इस बारे में चर्चा से बचना, आप फिर से नाम का पुन: उपयोग करने के लिए स्वतंत्र हैं।

-1

सुधार::

Transact-SQL कर्सर अत्यंत कुशल जब संग्रहीत प्रक्रियाओं और ट्रिगर में निहित हैं यहां उदाहरण के वे प्रदान करना है। इसका कारण यह है सब कुछ सर्वर पर एक निष्पादन योजना में संकलित किया गया है और वहाँ कोई नेटवर्क यातायात प्राप्त करने में कठिनाई पंक्तियों

  • संदर्भित msdn article से निकालें के साथ जुड़े है।

प्रदर्शन के लिए क्या बुरा है बार-बार एक संग्रहित प्रो के बाहर से अगली पंक्ति के लिए वैश्विक कर्सर को बुला रहा है। डीबी राउंड ट्रिप को कम करने के लिए क्लाइंट एपीआई बैचिंग सुविधाओं का उपयोग करना बेहतर है।

आप लाएं का उपयोग और प्रत्येक स्तंभ एक कार्यक्रम चर को FETCH द्वारा दिया जुड़ कर अनुप्रयोगों में Transact SQL कर्सर का उपयोग कर सकते हैं। ट्रांजैक्ट-एसक्यूएल फ़ेच बैच का समर्थन नहीं करता है, इसलिए, यह किसी एप्लिकेशन पर डेटा वापस करने का सबसे प्रभावी तरीका है। प्रत्येक पंक्ति को प्राप्त करने के लिए सर्वर पर एक राउंडट्रिप की आवश्यकता होती है। डेटाबेस एपीआई में निर्मित कर्सर कार्यक्षमता का उपयोग करने के लिए यह अधिक कुशल है जो पंक्तियों के बैच लाने वाले का समर्थन करता है।

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