0

次のストアド プロシージャがあります。

CREATE PROCEDURE [dbo].[vRpt_VolunteerPaymentsAll]
@startdate DATETIME = NULL ,
@enddate DATETIME = NULL ,
@user NVARCHAR(50)
AS /*  This procedure generates Team Events that have been audtied  */
DECLARE @sd DATETIME
DECLARE @ed DATETIME

/* Ensure that the start and end dates covert whole days */
SET @sd = CONVERT(VARCHAR(10), @startdate, 120) + ' 00:00:00'
SET @ed = CONVERT(VARCHAR(10), @enddate, 120) + ' 23:59:59'



DECLARE @id INT

INSERT  INTO vVolunteerPaymentEvents
        ( StartDate ,
          EndDate ,
          Verifier ,
          DatePaid ,
          RecordsPaid ,
          UnDone ,
          Comments ,
          Flags
        )
VALUES  ( @startdate ,
          @enddate ,
    /*Get the users initials*/
          ( SELECT  dbo.vUsers.Initials
            FROM    dbo.vUsers
            WHERE   dbo.vUsers.UserID = @user
          ) ,
          GETDATE() ,
    /* Count how many records are going ot be affected*/
          ( SELECT  COUNT(*)
            FROM    dbo.vVolunteerPayments
            WHERE   dbo.vVolunteerPayments.PaymentEventID = 0
                    AND ( dbo.vVolunteerPayments.DateCreated BETWEEN @sd
                                                          AND
                                                          @ed )
          ) ,
          0 ,
          '' ,
          0
        )
/*Set the id of the payment event id for the volunteer payments*/
SET @id = SCOPE_IDENTITY() ;

--get the totals for the payment based on the 
--@id value just inserted above 
UPDATE  dbo.vVolunteerPayments
SET     dbo.vVolunteerPayments.PaymentEventID = @id ,
        dbo.vVolunteerPayments.DatePaid = GETDATE()
WHERE   dbo.vVolunteerPayments.PaymentEventID = 0
        AND dbo.vVolunteerPayments.DateCreated BETWEEN @sd
                                               AND     @ed

SELECT * FROM 
(SELECT  VOLSACCT.volunteerid ,
        ISNULL(VOLS.Forename, '') + ' ' + ISNULL(VOLS.Surname, '') AS Name ,
        VOLSACCT.SortCode ,
        VOLSACCT.AccountName ,
        VOLSACCT.AccountNumber ,
        SUM(CASE [Type]
              WHEN 1001
              THEN CASE WHEN PMTS.DateCreated BETWEEN @sd AND @ed

                             --AND PMTS.PaymentEventID = 0
                             --AND PMTS.VolunteerId = @volunteerid
                        THEN Amount
                   END
              ELSE 0
            END) AS Reimbursements ,
        SUM(CASE [Type]
              WHEN 1002
              THEN CASE WHEN PMTS.DateCreated BETWEEN @sd AND @ed

                             --AND PMTS.PaymentEventID = 0
                             --AND PMTS.VolunteerId = @volunteerid
                        THEN Amount
                   END
              ELSE 0
            END) AS MobilePhoneCharges ,
        SUM(CASE [Type]
              WHEN 1003
              THEN CASE WHEN PMTS.DateCreated BETWEEN @sd AND @ed
                             --AND PMTS.PaymentEventID = 0
                             --AND PMTS.VolunteerId = @volunteerid
                        THEN Amount
                   END
              ELSE 0
            END) AS GPContributions ,
        SUM(CASE [Type]
              WHEN 12
              THEN CASE WHEN PMTS.DateCreated BETWEEN @sd AND @ed
                             --AND PMTS.PaymentEventID = 0
                             --AND PMTS.VolunteerId = @volunteerid
                        THEN Amount
                   END
              ELSE 0
            END) AS GPExpenses ,
        SUM(CASE [Type]
              WHEN 137
              THEN CASE WHEN PMTS.DateCreated BETWEEN @sd AND @ed
                             --PaymentEventID = 0
                             --AND PMTS.VolunteerId = @volunteerid
                        THEN Amount
                   END
              ELSE 0
            END) AS Expenses ,
        SUM(CASE WHEN PMTS.DateCreated BETWEEN @sd AND @ed

                      --AND PMTS.PaymentEventID = 0
                      --AND PMTS.VolunteerId = @volunteerid
                       THEN Mileage
                 ELSE 0
            END) AS TotalMileageWeek ,
        VOLSACCT.BACS,
        PMTS.ChargeRate

FROM    dbo.vVolunteerPayments PMTS
        INNER JOIN dbo.vVolunteerAccounts VOLSACCT ON PMTS.VolunteerId = VOLSACCT.VolunteerID
        INNER JOIN dbo.vVolunteers VOLS ON PMTS.VolunteerId = VOLS.VolunteerID
WHERE   PMTS.PaymentEventID = @id
GROUP BY VOLSACCT.volunteerid ,
        VOLSACCT.AccountName ,
        VOLSACCT.AccountNumber ,
        VOLSACCT.BACS ,
        VOLSACCT.SortCode ,
        VOLS.Forename ,
        VOLS.Surname,
        PMTS.ChargeRate) AS A
        WHERE 
        GPContributions >0
        OR GPExpenses > 0
        OR MobilePhoneCharges > 0
        OR Expenses > 0
        OR Reimbursements > 0 
        OR Expenses > 0
        OR TotalMileageWeek >0
        ORDER BY Name

基本的に、影響を受けるトランザクションの要約レコードを 1 つのテーブル (volunteerpaymentevent) に挿入し、別のテーブル (volunteerpayments(datepaid and payment event id)) の既存のレコードを更新してから、結合内の要約値のレコード セットを返します。

ただし、結合が失敗した場合、または結合がまったくない場合 (結果として何も出力されない場合) は、手順の更新部分がまだレコードを更新していることがわかりました。

ボランティア支払いテーブルのレコードを更新する前に、内部結合の結果を確認する方法はありますか? Cheers

4

1 に答える 1