CASE ステートメントが重複しないように、このスクリプトを単純化する方法はありますか? この短縮された例では許容できるように見えますが、実際には、「2 週間ごと」、「4 週間ごと」、「毎月」などのケースがあるため、CASE ステートメントははるかに長くなります。パフォーマンスのために SQL Server と WHILE ステートメントを使用しています。理由. CTE または MERGE は役に立ちますか?
DECLARE @theStartDate DATE
DECLARE @Interval INT
DECLARE @eventCharges TABLE
(
[EventDate] [datetime],
Person_Id int
)
SET @today = GETDATE()
SET @Interval = 0
-- delete event charges from previous user
DELETE FROM @eventCharges
-- Insert the calculated transactions
WHILE @Interval < 100
BEGIN
SET @Interval = @Interval + 1
INSERT INTO @eventCharges
SELECT
CASE
WHEN pcc.Recurrence = 'Daily'
THEN DATEADD(DAY, @Interval, @theStartDate)
WHEN pcc.Recurrence = 'Weekly'
THEN DATEADD(WEEK, @Interval, @theStartDate)
END AS EventDate
,pcc.Person_Id
FROM @personChargeCurrent pcc
WHERE CASE
WHEN pcc.Recurrence = 'Daily'
THEN DATEADD(DAY, @Interval, @theStartDate)
WHEN pcc.Recurrence = 'Weekly'
THEN DATEADD(WEEK, @Interval, @theStartDate)
END <= @today
AND NOT EXISTS(SELECT 1 FROM dbo.PersonChargeTransaction pct
WHERE pct.Person_Id = pcc.Person_Id
AND pct.PersonCharge_Id = pcc.Id
AND pct.TransactionDate =
CASE
WHEN pcc.Recurrence = 'Daily'
THEN DATEADD(DAY, @Interval, @theStartDate)
WHEN pcc.Recurrence = 'Weekly'
THEN DATEADD(WEEK, @Interval, @theStartDate)
END)
ORDER BY StartDate
END