web-dev-qa-db-ja.com

SQL Server 2008のストアドプロシージャ内にカーソルを書き込む方法

データベースに2つのテーブルがあります

クーポンテーブル

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

CouponUseテーブル

  • id(int)
  • Couponid(int)
  • CreateDate(datetime)

ユーザーがクーポンをクリックすると、そのクーポンの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からクーポン名とそのカウントを取得します

しかし、カーソルを使用してストアドプロシージャにそれを実装する方法がわかりませんか?

あなたが質問について尋ねることはすべて感謝されます、ありがとう

11
Smartboy

単純な単一のUPDATEステートメントを使用するだけで何が問題になりますか?

UPDATE dbo.Coupon
SET NoofUses = (SELECT COUNT(*) FROM dbo.CouponUse WHERE Couponid = dbo.Coupon.ID)

必要なのはそれだけです!乱雑で複雑なカーソル、ループ、RBAR(行ごとのアゴナイズ行)処理はありません。

12
marc_s

次のスニペットを試してください。アプリケーションから以下のストアドプロシージャを呼び出すと、クーポンテーブルの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

お役に立てれば!

13
Gowdhaman008

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 
0
bharat