Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQLServer2008中的存储过程中写入游标_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

如何在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(日期时间)
每当用户单击优惠券时,一个条目进入包含优惠券id的
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来应对这种情况,