次のストアド プロシージャがあります。
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