尝试使用 merge 语句使触发器起作用

Trying to make trigger with merge statement functional

正如标题所说,我正在尝试找到最好的方法来折射我的代码以工作并修复在 SQL Server 2019 中引发错误的语法。我尝试删除 case 关键字,将所有 when单个 case 关键字中的语句,并将每个 when 语句放在它们的特定 case 中,但每次它都会在我要删除行的行上给我一个错误。

这是我的代码,以便更好地理解。

CREATE trigger afterSalary
on Salary
Instead Of Insert
as
Begin
    Select P.Id, P.Valid_From, P.Valid_To 
into #TempTable
from Salary as P JOIN
inserted as I on S.Employee_ID = I.Employee_ID
WHERE S.Valid_From BETWEEN I.Valid_From AND I.Valid_To
or S.Valid_To BETWEEN I.Valid_From AND I.Valid_To

    MERGE Salary AS Pl
    USING #TempTable AS Tt
    ON (Pl.ID = Tt.ID)
    WHEN MATCHED AND
        CASE
            WHEN (Pl.Valid_From BETWEEN Tt.Valid_From AND Tt.Valid_To)
                and (Pl.Valid_To BETWEEN Tt.Valid_From AND Tt.Valid_To)
                THEN DELETE
        END
        CASE
            WHEN Pl.Valid_To > inserted.Valid_From
                THEN UPDATE SET Pl.Valid_To = CAST(DATEADD(DAY, -1, Inserted.Valid_From));
        END
        CASE
            WHEN Pl.Valid_From < Inserted.Valid_To
            THEN UPDATE SET Pl.Valid_From = CAST(DATEADD(DAY, +1, Inserted.Valid_To));
        END
    WHEN NOT MATCHED BY Tt
        THEN INSERT (Employee_ID, Valid_From, Valid_To) VALUES (Tt.Employee_ID, Tt.Valid_From, Tt.Valid_To);    
END

所以我不明白为什么那些 case 语句“then delete”准确地说给我语法错误。

这是我遇到的错误:

Msg 156, Level 15, State 1, Procedure afterSalary, Line 19 [Batch Start Line 12] Incorrect syntax near the keyword 'DELETE'.

这是我的薪水 table 在插入语句之前:

ID : 1, Employee_ID : 1, Valid_From : 2020/02/01, Valid_To : 2020/02/04
ID : 2, Employee_ID : 1, Valid_From : 2020/02/05, Valid_To : 2020/11/23
ID : 3, Employee_ID : 1, Valid_From : 2020/11/24, Valid_To : 2021/06/01
ID : 4, Employee_ID : 1, Valid_From : 2021/06/02, Valid_To : 2021/09/17

在我像这样为 ID 为 1 的雇员插入新薪水后:

INSERT INTO Salary (Employee_ID, Valid_From, Valid_To)
VALUES (1, '2020/11/24', '2021/08/06')

我希望我的薪水 table 在插入后看起来像:

ID : 1, Employee_ID : 1, Valid_From : 2020/02/01, Valid_To : 2020/02/04
ID : 2, Employee_ID : 1, Valid_From : 2020/02/05, Valid_To : 2020/11/23
ID : 5, Employee_ID : 1, Valid_From : 2020/11/24, Valid_To : 2021/08/06
ID : 4, Employee_ID : 1, Valid_From : 2021/08/07, Valid_To : 2021/09/17

每个 when 子句只能导致一个动作。添加具有多个操作的 CASE 打破了该规则。但好消息是你可以有多个 'WHEN MATCHED' 子句,条件不同,结果也不同。所以基本上你在这里有什么:

WHEN MATCHED AND
    CASE
        WHEN (Pl.Valid_From BETWEEN Tt.Valid_From AND Tt.Valid_To)
            and (Pl.Valid_To BETWEEN Tt.Valid_From AND Tt.Valid_To)
            THEN DELETE
    END
    CASE
        WHEN Pl.Valid_To > inserted.Valid_From
            THEN UPDATE SET Pl.Valid_To = CAST(DATEADD(DAY, -1, Inserted.Valid_From));
    END

变成:

WHEN MATCHED AND (Pl.Valid_From BETWEEN Tt.Valid_From AND Tt.Valid_To)
            and (Pl.Valid_To BETWEEN Tt.Valid_From AND Tt.Valid_To) 
THEN DELETE
WHEN MATCHED AND Pl.Valid_To > inserted.Valid_From
            THEN UPDATE SET Pl.Valid_To = CAST(DATEADD(DAY, -1, Inserted.Valid_From)