我的数据库中有两个表
优惠券表
优惠券表
每当用户点击优惠券时,条目会进入包含该优惠券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
但我不知道如何使用游标在存储过程中实现它?
您对问题提出的任何问题都将不胜感激,谢谢
答案 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
表中的Coupon
列
couponid
表格中使用了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