调试我的SQL Server触发器更新

时间:2016-09-27 04:16:42

标签: sql-server triggers

如果我使用普通查询尝试SQL语句,它可以正常工作:

// validating email id
private boolean isValidEmail(String email) {
    String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
            + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

    Pattern pattern = Pattern.compile(EMAIL_PATTERN);
    Matcher matcher = pattern.matcher(email);
    return matcher.matches();
}

// validating password with retype password
private boolean isValidPassword(String pass) {
    if (pass != null && pass.length() > 6) {
        return true;
    }
    return false;
}

但是它在触发器中不起作用。我可以成功保存触发器但是当我在表中手动插入记录进行测试时,我不断收到错误:

  

'MonthlyHourRecord'附近的语法不正确

这是我的触发器代码,请看看有什么可能是错误的,谢谢!

UPDATE TraineeMonthlyShopItemListRecord 
SET Data01 = 1
WHERE TraineeID = '553' 
  AND ShopItemListID = '17' 
  AND RecordID IN (SELECT a.recordid 
                   FROM TraineeMonthlyHourRecord a 
                   JOIN MonthlyHourRecord b ON a.RecordID = b.RecordID 
                   WHERE b.Month = '201609' 
                     AND a.TraineeID = '553' 
                   GROUP BY a.RecordID 
                   HAVING COUNT(*) = 1)

1 个答案:

答案 0 :(得分:0)

要评论大,所以我在答案中写下来。

您可以使用此

SELECT  TraineeID,
        ShopItemListID,
        RecordTime,
        Quantity,
        substring(CONVERT(varchar,@RecordTime, 112),1,4)+substring(CONVERT(varchar,@RecordTime, 112),5,2) as YYYYMM
        'Data'+substring(CONVERT(varchar,@RecordTime, 112),7,2) as DataDD 
FROM inserted

要与表格连接,您需要更新。

尝试一下:

;WITH cte AS (
SELECT  TraineeID,
        ShopItemListID,
        RecordTime,
        Quantity,
        substring(CONVERT(varchar,@RecordTime, 112),1,4)+substring(CONVERT(varchar,@RecordTime, 112),5,2) as YYYYMM
        'Data'+substring(CONVERT(varchar,@RecordTime, 112),7,2) as DataDD 
FROM inserted
)

UPDATE tm 
SET Data01 = c.Quantity
FROM TraineeMonthlyShopItemListRecord tm
INNER JOIN cte c
    ON c.TraineeID = tm.TraineeID 
        AND tm.ShopItemListID = c.ShopItemListID
CROSS APPLY (
    SELECT a.RecordID 
    FROM TraineeMonthlyHourRecord a 
    INNER JOIN MonthlyHourRecord b 
        ON a.RecordID = b.RecordID 
    WHERE b.Month = c.YYYYMM
        AND a.TraineeID = c.TraineeID 
    GROUP BY a.RecordID 
    HAVING COUNT(*) = 1
) a
WHERE a.RecordID = tm.RecordID