2016-09-27 120 views
2

如果我尝试用正常的查询的SQL语句,它工作正常,像这样:调试我的SQL Server触发更新

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) 

但是它不触发工作。我可以成功拯救触发但是当我测试手动插入一条记录在表中,我不断收到一个错误:

Incorrect syntax near 'MonthlyHourRecord'

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

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[t2] 
ON [dbo].[TraineeShopItemListRecord] 
AFTER INSERT  
AS  
BEGIN 
    declare @TraineeID varchar(10) 
    declare @MM varchar(10) 
    declare @YYYY varchar(10) 
    declare @ShopItemListID varchar(20) 
    declare @RecordID varchar(10) 
    declare @YYYYMM varchar(10) 
    declare @RecordTime datetime 
    declare @DD varchar(10) declare @test varchar(10) 
    declare @DataDD varchar(10) 
    declare @Quantity varchar(10) 
    declare @SQL nvarchar(200) 

    SELECT @ShopItemListID = ShopItemListID from inserted 
    SELECT @RecordTime = RecordTime from inserted 
    SELECT @Quantity = Quantity from inserted 

    SET @MM = substring(CONVERT(varchar,@RecordTime, 112),5,2) 
    SET @YYYY = substring(CONVERT(varchar,@RecordTime, 112),1,4) 
    SET @DD = substring(CONVERT(varchar,@RecordTime, 112),7,2) 

    SELECT @TraineeID = TraineeID from inserted 

    SET @YYYYMM = @[email protected] 
    SET @DataDD = 'Data'[email protected] 

    SET @SQL = 'UPDATE TraineeMonthlyShopItemListRecord SET  '[email protected]+'='[email protected]+' WHERE TraineeID ='''[email protected]+''' and ShopItemListID='''[email protected]+''' and RecordID IN (SELECT DISTINCT a.RecordID from TraineeMonthlyHourRecord a JOIN MonthlyHourRecord b on a.RecordID = b.RecordID WHERE b.Month ='''[email protected]+''' and a.TraineeID ='''[email protected]+''' GROUP BY a.RecordID HAVING COUNT(*) = 1)' 

    EXEC sp_executesql @SQL 
END 
+1

你的触发器有** **主要在缺陷您似乎认为它会被称为**每排一次** - 这是** **不案子。触发器将在每个语句**触发一次**,所以如果你的引发这个触发器触发的INSERT语句插入了25行,你将触发**触发**一次,但是随后插入的伪表将会包含25行。您的代码在这25行中选择哪一个? 'SELECT @Quantity =来自插入的数量' - 它是非确定性的,你将得到**一个任意的行**,你将**忽略所有其他行**。你需要重写你的触发器来考虑这个问题! –

+0

感谢您的建议。我应该考虑改写它的方向是什么? – autopenta

+0

您需要考虑到'Inserted'(和'Deleted')将包含**多行**,因此您需要使用** set-based **操作,而不是获取单个列值。 –

回答

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 
+0

非常感谢您的解释。 – autopenta

+0

我的荣幸!希望对你有帮助 :) – gofr1