2

我有两张桌子

EmpAssignment
EmpId | 位置编号 | 其他不相关的

每月交易
EmpID | 支付码 | 输入金额 | 和其他不相关的

我想要一个触发器(或任何有效的),如果:

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

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

现在更棘手的部分,MonthlyTransaction.EmpID是一个外键,这意味着,每个EmpID的行数不止一个,并且 Insert,更新应该只影响Paycode 35 或 36 和 InputAmount 12 或 15的EmpID行。

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

到目前为止我在哪里:

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 paycode 和 inputAmnt 与 35 和 12

我知道这有很多问题,但请有人救我。

4

2 回答 2

1

首先使用所有未找到的,UPDATE然后使用INSERT类似这样的内容(仅显示 Paycode = 35、InputAmnt = 12 和 LocationNo = 104)。

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

INSERT M
SET EmpId = E.EmpID, InputAmnt = 12, Paycode = 35
FROM inserted E
LEFT JOIN MonthlyTransaction AS M
    ON E.EmpId = M.EmpId AND E.LocationNo = 104 AND Paycode = 35
WHERE M.EmpID  NULL

如果您使用 SQL 2008 或更高版本,则可以使用MERGE代替UPDATEINSERT

于 2013-07-18T14:22:34.800 回答
0

这是你的触发器。使用 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 演示

于 2013-07-18T14:25:47.063 回答