データベースに2つのテーブルがあります
クーポンテーブル
CouponUseテーブル
ユーザーがクーポンをクリックすると、そのクーポンのIDを含むCouponUse
テーブルにエントリが追加されます
これで、coupon
テーブルにNoofUses
という列があります。 couponuse
テーブルをループするストアドプロシージャ内にカーソルを作成し、1つのクーポンの行数を確認して、クーポンの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
からクーポン名とそのカウントを取得します
しかし、カーソルを使用してストアドプロシージャにそれを実装する方法がわかりませんか?
あなたが質問について尋ねることはすべて感謝されます、ありがとう
単純な単一のUPDATE
ステートメントを使用するだけで何が問題になりますか?
UPDATE dbo.Coupon
SET NoofUses = (SELECT COUNT(*) FROM dbo.CouponUse WHERE Couponid = dbo.Coupon.ID)
必要なのはそれだけです!乱雑で複雑なカーソル、ループ、RBAR(行ごとのアゴナイズ行)処理はありません。
次のスニペットを試してください。アプリケーションから以下のストアドプロシージャを呼び出すと、クーポンテーブルの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
お役に立てれば!
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