J'ai deux tables dans ma base de données
Tableau des coupons
Tableau des coupons
Chaque fois qu'un utilisateur clique sur un coupon, une entrée entre dans la table CouponUse
contenant l'identifiant de ce coupon.
Il existe maintenant une colonne dans la table coupon
appelée NoofUses
. Je veux écrire un curseur dans une procédure stockée qui boucle sur la table couponuse
et voit combien de lignes il y a pour un coupon et remplit ce nombre dans le champ NoofUses
du coupon.
J'ai cette question
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
ce qui me donne le nom du coupon et son compte de couponuse
Mais je ne sais pas comment implémenter cela dans une procédure stockée à l'aide d'un curseur?
Tout ce que vous posez sur la question sera apprécié, merci
Quel est le problème avec simplement en utilisant une seule et unique instruction UPDATE
?
UPDATE dbo.Coupon
SET NoofUses = (SELECT COUNT(*) FROM dbo.CouponUse WHERE Couponid = dbo.Coupon.ID)
C'est tout ce qui est nécessaire! Pas de curseur compliqué et compliqué, pas de boucle, pas de traitement RBAR (rangée par rangée) ... juste une instruction SQL simple, claire et propre.
Essayez l'extrait suivant. Vous pouvez appeler la procédure stockée ci-dessous à partir de votre application pour que NoOfUses
de la table des coupons soit mis à jour.
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 couponuse.id=@cuponId
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 NoofUses=@couponCount
where couponuse.id=@couponIdFromQuery
Fetch Next From curP Into @couponCount, @CouponName,@couponIdFromQuery
End -- End of Fetch
Close curP
Deallocate curP
J'espère que cela t'aides!
Vous pouvez créer un déclencheur qui met à jour la colonne NoofUses
dans la table Coupon
chaque fois que couponid
est utilisé dans la table CouponUse
.
requête:
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