it-swarm.com.de

So schreiben Sie einen Cursor in eine gespeicherte Prozedur in SQL Server 2008

Ich habe zwei Tabellen in meiner Datenbank 

Kupontabelle  

  • id (int)
  • Name (nvarchar (max))
  • NoofUses (int)

CouponUse-Tabelle

  • id (int)
  • Couponid (int)
  • CreateDate (datetime)

Immer wenn ein Benutzer auf einen Coupon klickt, wird ein Eintrag in die CouponUse-Tabelle mit der ID dieses Coupons aufgenommen 

In der Tabelle coupon befindet sich jetzt eine Spalte mit dem Namen NoofUses. Ich möchte einen Cursor in eine gespeicherte Prozedur schreiben, die die couponuse-Tabelle durchläuft und sieht, wie viele Zeilen für einen Coupon vorhanden sind, und diese Zahl im NoofUses-Feld im Coupon ausfüllen.

Ich habe diese Frage

  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

was gibt mir den Kuponnamen und seine Zählung von couponuse 

Aber ich weiß nicht, wie man das in einer gespeicherten Prozedur mit einem Cursor implementiert? 

Alles, was Sie über eine Frage stellen, wird dankbar sein

10
Smartboy

Was ist daran falsch, einfach eine einzelne, einfache UPDATE-Anweisung zu verwenden?

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

Das ist alles was benötigt wird! Kein unordentlicher und komplizierter Cursor, keine Schleife, keine RBAR-Verarbeitung (Row-by-Agonizing-Row) ... nur eine nette, einfache, saubere, set-basierte SQL-Anweisung.

11
marc_s

Versuchen Sie das folgende Snippet. Sie können die unten stehende gespeicherte Prozedur aus Ihrer Anwendung aufrufen, sodass NoOfUses in der Coupon-Tabelle aktualisiert wird.

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

Hoffe das hilft!

12
Gowdhaman008

Sie können einen Auslöser erstellen, der die NoofUses-Spalte in der Coupon-Tabelle aktualisiert, wenn couponid in der CouponUse-Tabelle verwendet wird 

abfrage:

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 
0
bharat