SQL Server,BIG挑战,更新触发器或过程(无论如何)

开尔文

我有两张桌子

EmpAssignment
EmpId | 位置否| 其他相关

每月交易
EmpID | 支付码| InputAmount | 和其他相关

我想要一个触发器(或其他可行的方法),例如:

1. 将某个EmpID的EmpAssignment.LocationNo插入或更新为值104或105,然后分别为monthlyTransaction.PaycodeMonthlyTransaction.InputAmount插入值35和12。

2. 插入某个EmpID的EmpAssignment.LocationNO,将其更新为值204或205,然后分别为monthlyTransaction.PaycodeMonthlyTransaction.InputAmount插入值36和15。

现在,更技巧性的部分,MonaryTransaction.EmpID是一个外键,这意味着每个EmpID的行中的行数超过,并且Insert,update应该只影响Paycode为35或36且InputAmount为12或15EmpID行。

如果没有上述特定EmpID的行,且上面有Paycode和InputAmount,则触发器应插入否则进行更新。

我到目前为止所到之处:

CREATE TRIGGER tr_ProvincialAllowance
ON [dbo].[Empassignment]
FOR INSERT, UPDATE
AS
UPDATE M
SET Paycode = 35, InputAmnt = 12
FROM MonthlyTransaction AS M
INNER JOIN inserted E
ON E.EmpId = M.EmpId AND E.LocationNo = 104

上述触发器的问题之一是它将更新所有MonthlyTransaction。EmpID支付码和带有35和12的inputAmnt

我知道有很多要问的问题,但是请有人救我。

内纳德·齐夫科维奇(Nenad Zivkovic)

这是您的触发器。使用CTE设置Source和Target的条件,然后使用简单的MERGE语句即可完成其余工作。

CREATE TRIGGER tr_ProvincialAllowance
ON [dbo].[Empassignment]
AFTER INSERT, UPDATE
AS
BEGIN

    WITH CTE_Target AS 
    (
        SELECT m.* 
        FROM MonthlyTransaction m
         INNER JOIN INSERTED e ON e.EmpID = m.EmpID
        WHERE m.PayCode IN (35,36)
         AND m.InputAmount IN (12,15)   
    )
    ,CTE_Source AS
    (
        SELECT i.empID
            ,i.LocationNo
            ,CASE WHEN i.LocationNo IN (104,105) THEN 35 ELSE 36 END AS PayCode
            ,CASE WHEN i.LocationNo IN (104,105) THEN 12 ELSE 15 END AS InputAmount
        FROM INSERTED i
        WHERE i.LocationNo  IN (104,105,204,205)
    )  
    MERGE CTE_Target t
    USING CTE_Source s
    ON s.EmpID = t.EmpID
    WHEN MATCHED THEN 
        UPDATE SET t.PayCode = s.PayCode, T.InputAmount = s.InputAmount
    WHEN NOT MATCHED THEN 
        INSERT (EmpID, PayCode,InputAmount) 
        VALUES (s.EmpID, s.PayCode, s.InputAmount);
END

SQLFiddle演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章