11

我的数据库中有两个表

优惠券表

  • 标识(整数)
  • 名称 (nvarchar(max))
  • NoofUses (int)

优惠券使用表

  • 编号(整数)
  • 优惠券(int)
  • 创建日期(日期时间)

每当用户单击优惠券时,都会进入CouponUse包含该优惠券 ID 的表中的条目

现在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

但我不知道如何使用游标在存储过程中实现它?

您提出的任何问题将不胜感激,谢谢

4

3 回答 3

15

试试下面的代码片段。您可以从您的应用程序中调用以下存储过程,以便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 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

希望这可以帮助!

于 2012-11-22T07:14:09.183 回答
12

仅仅使用一个简单的UPDATE语句有什么问题?

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

这就是所需要的!没有混乱和复杂的游标,没有循环,没有 RBAR(逐行)处理......只是一个漂亮、简单、干净的基于集合的 SQL 语句。

于 2012-11-22T08:06:04.213 回答
0

您可以创建一个触发器,该触发器NoofUsesCouponcouponid中使用时更新表中的CouponUse

询问 :

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 
于 2017-08-10T05:48:38.950 回答