2012-11-22 12 views
8

मैं अपने डेटाबेस में दो तालिकाओं हैकैसे एसक्यूएल सर्वर में एक संग्रहीत प्रक्रिया के अंदर एक कर्सर लिखने के लिए 2008

कूपन टेबल

  • आईडी (int)
  • नाम (nvarchar (अधिकतम))
  • NoofUses (int)

CouponUse तालिका

  • आईडी (int)
  • Couponid (int)
  • CreateDate (दिनांक)

जब भी कोई कूपन पर एक उपयोगकर्ता क्लिक करता है एक प्रविष्टि है कि कूपन के आईडी

युक्त CouponUse तालिका में चला जाता है

अब coupon तालिका में एक कॉलम है जिसे NoofUses कहा जाता है। मैं एक संग्रहित प्रक्रिया के अंदर एक कर्सर लिखना चाहता हूं जो couponuse तालिका से अधिक हो जाता है और देखता है कि एक कूपन के लिए कितनी पंक्तियां हैं और उस नंबर को NoofUses कूपन में फ़ील्ड भरें।

मैं इस क्वेरी

select COUNT(*) as totalcount , Name as name from Coupon as coupon 
    join CouponUse as couponuse on coupon.id = couponuse.couponid 
    group by couponuse.couponid , coupon.Name 

जो मुझे कूपन नाम और couponuse

से इसकी गिनती देता है लेकिन मुझे लगता है कि एक कर्सर का उपयोग एक संग्रहीत प्रक्रिया में लागू करने के लिए पता नहीं कैसे है?

कुछ भी आप सवाल के बारे में पूछने की सराहना की जाएगी, धन्यवाद

उत्तर

10

बस एक सिंगल, सरल UPDATE कथन का उपयोग करने में क्या गलत है ??

UPDATE dbo.Coupon 
SET NoofUses = (SELECT COUNT(*) FROM dbo.CouponUse WHERE Couponid = dbo.Coupon.ID) 

यह सब कुछ जरूरी है! कोई गन्दा और जटिल कर्सर नहीं, कोई लूपिंग नहीं, कोई आरबीएआर (पंक्ति-दर-एगोनिज़िंग-पंक्ति) प्रसंस्करण ..... बस एक अच्छा, सरल, साफ सेट-आधारित SQL कथन।

+0

ग्रेट @marc_s, मेरी इच्छा है कि मैं एक दिन में आपके जैसे एसक्यूएल में एक विशेषज्ञ बनूंगा ... आप को हट्स और यह पहली बार नहीं है कि आपने मेरी कई समस्याएं हल की हैं, धन्यवाद फिर से – Smartboy

+1

@Smartboy: धन्यवाद! यह ज्यादातर समय और अनुभव का मामला है - एक बार जब आप भूरे और बूढ़े हो जाते हैं, तो आप उतने ही बुद्धिमान होंगे :-) –

+0

वैसे भी मुझे एसक्यूएल सीखने के लिए आपको लगता है कि कोई भी सर्वश्रेष्ठ सुझाव दें। मेरा मतलब है कि मैं इस तरह की स्थितियों से लड़ने के लिए एसक्यूएल कैसे सीख सकता हूं, – Smartboy

10

यह स्निपेट का प्रयास करें। आप नीचे दिए गए संग्रहीत प्रक्रिया को अपने एप्लिकेशन से कॉल कर सकते हैं, ताकि कूपन तालिका में NoOfUses अपडेट हो जाए।

CREATE PROCEDURE [dbo].[sp_UpdateCouponCount] 
AS 

Declare  @couponCount int, 
      @CouponName nvarchar(50), 
      @couponIdFromQuery int 


Declare curP cursor For 

    select COUNT(*) as totalcount , Name as name,couponuse.couponid as couponid from Coupon as coupon 
    join CouponUse as couponuse on coupon.id = couponuse.couponid 
    where [email protected] 
    group by couponuse.couponid , coupon.Name 

OPEN curP 
Fetch Next From curP Into @couponCount, @CouponName,@couponIdFromQuery 

While @@Fetch_Status = 0 Begin 

    print @couponCount 
    print @CouponName 

    update Coupon SET [email protected] 
    where [email protected] 


Fetch Next From curP Into @couponCount, @CouponName,@couponIdFromQuery 

End -- End of Fetch 

Close curP 
Deallocate curP 

आशा है कि इससे मदद मिलती है!

+1

वहाँ एक समस्या @Gowdhaman है कि इस पर केवल एक कूपन अद्यतन करेगा है एक समय, मैं चाहता हूं कि जब मैं स्टोर प्रक्रिया निष्पादित करता हूं तो यह सभी कूपन अपडेट करता है जो एक – Smartboy

+0

नहीं है, मैंने अब क्वेरी संपादित की है। पैरामीटर से CouponId हटा दिया। कर्सर की चयन क्वेरी में couponId जोड़ा गया [चूंकि यह पहले से ही] आपके समूह में कथन द्वारा उपलब्ध है। अद्यतन आईडी में उस आईडी का उपयोग किया। यह आपकी मदद कर सकता है। – Gowdhaman008

+0

अब मुझे इस त्रुटि का सामना करना पड़ रहा है 'Cursorfetch: INTO सूची में घोषित चर की संख्या चयनित कॉलम से मेल खाना चाहिए। ' – Smartboy

0

आप ट्रिगर के जो अद्यतन करता है बना सकते हैं NoofUsesCoupon तालिका जब भी couponidCouponUse तालिका में प्रयोग किया जाता है में स्तंभ

क्वेरी:

CREATE TRIGGER [dbo].[couponcount] ON [dbo].[couponuse] 
FOR INSERT 
AS 
if EXISTS (SELECT 1 FROM Inserted) 
    BEGIN 
UPDATE dbo.Coupon 
SET NoofUses = (SELECT COUNT(*) FROM dbo.CouponUse WHERE Couponid = dbo.Coupon.ID) 
end 
संबंधित मुद्दे