Ich habe zwei Tabellen in meiner Datenbank
Kupontabelle
CouponUse-Tabelle
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
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.
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!
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