正如標題所說,我正在嘗試找到折射代碼以使其正常作業并修復在 SQL Server 2019 中引發錯誤的語法的最佳方法。我嘗試洗掉 case 關鍵字,將所有 when 陳述句放在單個 case 關鍵字中,并將每個 when 陳述句在他們的特定情況下,但每次它都會在我想要洗掉行的行上給我一個錯誤。
這是我的代碼,以便更好地理解。
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 陳述句“然后洗掉”準確地說給了我語法錯誤。
這是我得到的錯誤:
Msg 156, Level 15, State 1, Procedure afterSalary, Line 19 [Batch Start Line 12] 關鍵字“DELETE”附近的語法不正確。
這是我在插入陳述句之前的薪水表:
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 的 Employeed 插入新工資后:
INSERT INTO Salary (Employee_ID, Valid_From, Valid_To)
VALUES (1, '2020/11/24', '2021/08/06')
我希望插入后的工資表看起來像:
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
uj5u.com熱心網友回復:
每個 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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/329771.html
