web-dev-qa-db-fra.com

Comment écrire un curseur dans une procédure stockée dans SQL Server 2008

J'ai deux tables dans ma base de données 

Tableau des coupons  

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

Tableau des coupons

  • id (int)
  • Couponid (int)
  • CreateDate (date/heure)

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

10
Smartboy

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.

11
marc_s

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!

12
Gowdhaman008

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