2009-12-03 41 views
1

我需要根据tableB中的插入更新我的tableA。我创建了一个触发器,当一行被插入tableB时触发,并简单地将它复制到tableA(这正是我想要的)。但是,当我更新tableB中的现有记录时,问题就出现了,tableA中的行已经存在,并且具有相同的主键。用触发器更新多个表 - SQL Server

要处理它,我试图删除tableA中的主键与更新的行相匹配的现有行,然后插入“插入”表中的行。但是,tsql根本不让我从触发器中删除我,并给出了一个错误,指出“多部分标识符”INSERTED.Id“无法绑定”。

这里就是我试图完成代码明智:

delete from dbo.CurrentItems where dbo.CurrentItems.CurrentItemId = INSERTED.Id 
INSERT INTO CurrentItems 
SELECT * FROM INSERTED 
WHERE IsActive = 1 

任何想法的家伙?

回答

3

在DELETE FROM语句,你要插入的假表添加到你的工作(在FROM子句)的表,像这样:

DELETE dbo.CurrentItems 
    FROM dbo.CurrentItems 
    , INSERTED 
WHERE dbo.CurrentItems.CurrentItemId = INSERTED.Id 

INSERT INTO CurrentItems 
SELECT * FROM INSERTED 
WHERE IsActive = 1 

或者,你可以使用INNER JOIN:

DELETE dbo.CurrentItems 
    FROM dbo.CurrentItems CI 
     INNER JOIN INSERTED I ON CI.CurrentItemId = I.Id 
+0

非常感谢................ – Xience 2009-12-03 17:44:06

+1

独立触发 - 一个用于插入,一个更新(和怎么样删除?) - 可能会表现更好。 – 2009-12-03 17:51:50

+0

@Ifanfan:不客气。 @Phillip Kelley,我不能不同意你的意见,但现在这就是海报的要求。他想知道为什么他的DELETE声明不起作用。 – 2009-12-03 18:50:33

3

为什么在TableB中的行更新时,为什么不能简单地更新TableA中的现有行? UPDATE而不是DELETE/INSERT。

你可以有一个AFTER INSERT触发器这确实你现在想要什么,再加上一个AFTER UPDATE触发器这将是更新TableA中的行(而不是插入新的)。

0

你说你有一个触发器,当“一行插入到tableB”时触发。所以你有触发器来触发插入。这听起来像你也有触发器触发更新以及。你是否想让触发器触发更新?如果没有,请从触发器定义中删除“更新”。

兰迪