0

私は現在、パートナーのためにさまざまなタスクを実行することに対してユーザーに報酬を与えることができる小さなシステムを構築しています. パートナー Y のために X を実行すると、Z の金額がユーザーに報酬として与えられます。常に多くの小さなアカウントの動きを転送する代わりに、1 日のすべてのユーザー アクティビティに対して組み合わせたボーナスを提供したいと考えています。

真夜中頃に SQL Server エージェントで実行できるストアド プロシージャを構築したいと考えています。このストアド プロシージャは、ユーザーの収益を合計し、アカウントに追加します。ただし、一度にこの作業を行うことができるユーザーは 1 人だけです。ストアド プロシージャへの 1 回の呼び出しで 100 人のユーザーの収益を管理することは可能ですか?

分解するには、ストアド プロシージャを一度に 1 ユーザーずつ 100 回呼び出すのではなく、1 回の呼び出しで合計 100 ユーザーのトランザクションを処理できるストアド プロシージャが必要です。それは可能ですか?

前もって感謝します!

編集:

ここに私が取り組んできたいくつかのサンプルコードがあります:

ALTER PROCEDURE [dbo].[rewards_dailybonus]
AS
BEGIN
SET NOCOUNT ON;

DECLARE @userid INT = 0
DECLARE @partnerId INT = 0
DECLARE @totalPoints INT = 0
DECLARE @theDate DATETIME = ''


    -- This SELECT should return 100 rows
    SELECT @userid = userid, @partnerId = partnerId, @totalPoints = SUM(points), @theDate = CAST(created AS DATE)
    FROM rewards_movements WITH (NOLOCK)
    WHERE
        transferred IS NULL
        AND
        CAST(created AS DATE) != CAST(GETDATE() AS DATE)
    GROUP BY userid, partnerId, CAST(created AS DATE)
    ORDER BY CAST(created AS DATE), userid ASC

    -- For each row from above SELECT, execute another Stored Procedure to add the points to a users account
    EXEC registerAccountMovement @userid, @totalPoints, 'Account movement notice'

    -- Set the points as transferred
    UPDATE rewards_movements SET transferred = GETDATE() WHERE userid = @userid AND partnerId = @partnerId
END
4

1 に答える 1

1

さて、コードは次のようになると思います。

with toupdate as (
      select userid, sum(earnings) as NewEarnings
      from tblEarnings e
      where e.earningdate = cast(getdate() -1 as date)
      group by userid
     )
update users
    set earnings = earnings + newearnings
    from toupdate
    where users.userid = toupdate.userid

これは明らかに単なるスケッチですが、セット指向の方法で必要なことを行う方法を示しています。

于 2013-02-06T14:47:33.580 に答える