如何在SQLServer2008中的存储过程中写入游标
我的数据库中有两个表 优惠券表如何在SQLServer2008中的存储过程中写入游标,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我的数据库中有两个表 优惠券表 id(int) 名称(nvarchar(最大值)) (国际) 耦合使用表 id(int) Couponid(int) CreateDate(日期时间) 每当用户单击优惠券时,一个条目进入包含优惠券id的CouponUse表 现在,优惠券表中有一列名为NoofUses。我想在一个存储过程中写入一个游标,该存储过程在couponuse表上循环,查看一张优惠券有多少行,并将该数字填入优惠券中的NoofUses字段 我有这个疑问 select COUNT(*)
- id(int)
- 名称(nvarchar(最大值))
- (国际)
- id(int)
- Couponid(int)
- CreateDate(日期时间)
CouponUse
表
现在,优惠券
表中有一列名为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
但我不知道如何在使用游标的存储过程中实现它
如果您对这个问题有任何疑问,我们将不胜感激。请尝试以下代码片段。您可以从应用程序中调用以下存储过程,以便更新优惠券表中的
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
希望这有帮助 仅仅使用一个简单的
UPDATE
语句有什么不对
UPDATE dbo.Coupon
SET NoofUses = (SELECT COUNT(*) FROM dbo.CouponUse WHERE Couponid = dbo.Coupon.ID)
这就是所需要的!没有凌乱和复杂的光标,没有循环,没有RBAR(一行接一行)处理。。。。。这只是一个漂亮、简单、干净的基于集合的SQL语句。您可以创建一个触发器,在任何时候更新
优惠券
表中的列
CouponUse
表中使用了couponid
查询:
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
@Gowdhaman有一个问题,这将一次只更新一个优惠券,我希望当我执行存储过程时,它会更新所有优惠券,而不是单个优惠券。我现在已经编辑了查询。已从参数中删除CouponId。将couponId添加到游标的select查询中[因为它已经在group by语句中可用]。在Update语句中使用了该Id。这可能会对您有所帮助。现在我面临一个错误Cursorfetch:INTO列表中声明的变量数量必须与所选列的数量匹配代码>我想我们没有在任何地方设置@couponIdFromQueryquery@Smartboy,我错过了Fetch Next语句中的cuponIdFromQuery。我再次编辑了代码。我看到您的问题没有使用marc_的游标就解决了。很高兴知道这一点。我想你真的需要游标。太棒了@marc_s,我希望有一天我能像你一样成为sql方面的专家。。。向你致敬,这不是你第一次解决我的许多问题,谢谢again@Smartboy:谢谢!这主要是时间和经验的问题-一旦你像我一样变灰变老,你就会变得同样聪明:-)无论如何,给我你认为学习sql最好的建议。我的意思是,我如何学习sql来应对这种情况,