2010-11-19 11 views
15

में कर्सर का सटीक उपयोग क्या है, मुझे पता है कि यह दोहराया जा सकता है, लेकिन मुझे त्वरित उत्तर चाहिए, और अधिक खोजना नहीं चाहते ... अच्छा .... अग्रिम उत्तर के लिए धन्यवाद ....एसक्यूएल सर्वर

मैं कर्सर लिखना चाहता हूं, मैं समझना चाहता हूं कि इसका उपयोग क्या है, वाक्यविन्यास और किस परिदृश्य में हम संग्रहीत प्रक्रिया में इसका उपयोग कर सकते हैं? एसक्यूएल सर्वर 2008, एसक्यूएल सर्वर 2008 आर 2 और एसक्यूएल सर्वर 2005 के लिए अलग वाक्यविन्यास क्या हैं?

इसका उपयोग क्यों करना आवश्यक है?

+7

कृपया इसे पहले खोजें .... – anishMarokey

+1

खोज में वास्तव में अधिक समय नहीं लगता है, मुझे यह आलेख आसानी से मिला है और इसमें आपके द्वारा पूछे जाने वाले अधिकांश प्रश्न शामिल हैं: http://www.sqlteam.com/article/cursors -न-ओवरव्यू – Tony

उत्तर

22

कर्सर एक परिणाम सेट के पंक्तियों के माध्यम से स्पष्ट रूप से गणना करने के लिए एक तंत्र है, इसे पुनर्प्राप्त करने के बजाय।

हालांकि, While Not RS.EOF Do ... लिखने के आदी प्रोग्रामर के लिए उपयोग करने में अधिक आरामदायक हो सकता है, लेकिन यदि संभव हो तो वे SQL सर्वर संग्रहीत प्रक्रियाओं में से बचने के लिए आम तौर पर एक चीज से बचने के लिए एक चीज हैं - यदि आप बिना किसी प्रश्न के एक प्रश्न लिख सकते हैं कर्सर, आप ऑप्टिमाइज़र को इसे लागू करने के लिए एक तेज़ तरीका खोजने का एक बेहतर मौका देते हैं।

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

+0

+1 अधिकांश समय वे आवश्यक नहीं हैं। केवल उन्हें एक बार नौकरियों में उपयोग करें या जब अन्य सभी विकल्प विफल हो जाएं। –

+4

ट्रिगर्स से संबंधित होने पर कर्सर के लिए एकमात्र वास्तविक आवश्यकता है - यदि आपके पास एकाधिक रिकॉर्ड प्रभावित हैं, और आप प्रत्येक रिकॉर्ड के लिए एक संग्रहित प्रो निष्पादित करना चाहते हैं, तो आपको ट्रिगर टेबल (जैसे "सम्मिलित") – RPM1984

+0

तो एक कर्सर का उपयोग परिणाम सेट की पंक्तियों के माध्यम से फिर से करने के लिए किया जाता है, उदाहरण के लिए लंबित से 100 पंक्तियों की स्थिति को अपडेट करने के लिए? – JsonStatham

5

कर्सर पंक्ति आधार के आधार पर डेटा पंक्ति को पुनर्प्राप्त करने के लिए उपयोग किया जा सकता है। एक लूपिंग कथन (यानी जबकि लूप के लिए) की तरह कार्य करता है। SQL प्रक्रियाओं में कर्सर का उपयोग करने के लिए, आपको निम्न कार्य करने की आवश्यकता है: 1. परिणाम सेट को परिभाषित करने वाले कर्सर की घोषणा करें। 2. परिणाम सेट स्थापित करने के लिए कर्सर खोलें। 3. डेटा को स्थानीय चर में कर्सर से आवश्यकतानुसार एक पंक्ति में प्राप्त करें। 4. कर्सर बंद होने पर बंद करें।

पूर्व के लिए

:

declare @tab table 
(
Game varchar(15), 
Rollno varchar(15) 
) 
insert into @tab values('Cricket','R11') 
insert into @tab values('VollyBall','R12') 

declare @game varchar(20) 
declare @Rollno varchar(20) 

declare cur2 cursor for select game,rollno from @tab 

open cur2 

fetch next from cur2 into @game,@rollno 

WHILE @@FETCH_STATUS = 0 
begin 

print @game 

print @rollno 

FETCH NEXT FROM cur2 into @game,@rollno 

end 

close cur2 

deallocate cur2 
13

कर्सर क्योंकि उप क्वेरी में उपयोग किया जाता है हम पंक्ति द्वारा रिकॉर्ड पंक्ति प्राप्त कर सके तो हम कर्सर का उपयोग रिकॉर्ड

कर्सर का उदाहरण लाने के लिए:

DECLARE @eName varchar(50), @job varchar(50) 

DECLARE MynewCursor CURSOR -- Declare cursor name 

FOR 
Select eName, job FROM emp where deptno =10 

OPEN MynewCursor -- open the cursor 

FETCH NEXT FROM MynewCursor 
INTO @eName, @job 

PRINT @eName + ' ' + @job -- print the name 

WHILE @@FETCH_STATUS = 0 

BEGIN 

FETCH NEXT FROM MynewCursor 
INTO @ename, @job 

PRINT @eName +' ' + @job -- print the name 

END 

CLOSE MynewCursor 

DEALLOCATE MynewCursor 

उत्पादन:

ROHIT       PRG 
jayesh       PRG 
Rocky       prg 
Rocky       prg 
+0

कृपया अपना उत्तर संपादित करें और इसे पढ़ने योग्य बनाने के लिए कोड को प्रारूपित करें। – kleopatra

+0

हम सामान्य प्रश्न 'ईनाम का चयन करें, एम्म से नौकरी जहां deptno = 10' का एक ही परिणाम प्राप्त कर सकते हैं तो कर्सर को लूप करने के लिए इसका उपयोग क्यों करें, कोई व्यावहारिक उपयोग? – Thunder

+0

मेरे पास एक प्रश्न है कि मैं कर्सर में उपयोगकर्ता परिणाम सेट कर सकता हूं जैसे कि Google में पाए गए सभी उदाहरण 'PRINT' नाम का उपयोग कर रहे हैं: '+ @ name +', pagename: '+ कन्वर्ट (वर्कर (20), @ वेतन)' लेकिन क्या मैं वापसी परिणाम यहां से सी # तक सेट है? –

0

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

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