如果我尝试用正常的查询的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
你的触发器有** **主要在缺陷您似乎认为它会被称为**每排一次** - 这是** **不案子。触发器将在每个语句**触发一次**,所以如果你的引发这个触发器触发的INSERT语句插入了25行,你将触发**触发**一次,但是随后插入的伪表将会包含25行。您的代码在这25行中选择哪一个? 'SELECT @Quantity =来自插入的数量' - 它是非确定性的,你将得到**一个任意的行**,你将**忽略所有其他行**。你需要重写你的触发器来考虑这个问题! –
感谢您的建议。我应该考虑改写它的方向是什么? – autopenta
您需要考虑到'Inserted'(和'Deleted')将包含**多行**,因此您需要使用** set-based **操作,而不是获取单个列值。 –