如何在SQL Server 2008中的存储过程中编写游标

时间:2012-11-22 06:57:04

标签: sql sql-server sql-server-2008 tsql

我的数据库中有两个表

优惠券表

  • id(int)
  • 名称(nvarchar(max))
  • NoofUses(int)

优惠券表

  • ID(int)的
  • Couponid(int)的
  • CREATEDATE(日期时间)

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

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

获取优惠券名称及其计数

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

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

3 个答案:

答案 0 :(得分:13)

尝试以下代码段。您可以从应用程序中调用以下存储过程,以便更新优惠券表中的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

希望这有帮助!

答案 1 :(得分:11)

仅仅使用一个简单的UPDATE语句

就有什么问题
UPDATE dbo.Coupon
SET NoofUses = (SELECT COUNT(*) FROM dbo.CouponUse WHERE Couponid = dbo.Coupon.ID)

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

答案 2 :(得分:0)

您可以创建一个触发器,用于更新NoofUses表中的Couponcouponid表格中使用了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