在sqlserver 2008中使用触发器在表上合并语句

时间:2011-06-21 09:35:47

标签: sql-server-2008

我是SQL Server 2008的新用户,根据要求,我们必须使用MERGE语句根据特定条件更新/插入目标表。

问题是 - 目标表有更新触发器,我们在其中使用了像这样的插入表

select StudentID from Inserted 

当我运行merge语句时,它会在触发器处抛出错误,说子查询返回多行,这是不允许的。

这是否意味着对从merge语句处理的所有记录触发了触发器?我们可以为处理的每条记录触发触发器吗?

任何人都可以帮助我。

感谢

1 个答案:

答案 0 :(得分:1)

是的,在SQL Server中,每个语句触发一次,而不是每行触发一次。

我没有向我们展示足够的SQL来建议如何重新编写触发器。如果是这样的话:

UPDATE Table2 set ABC = DEF where ID = (select StudentID from Inserted)

然后重写就像:

UPDATE Table2 set ABC = DEF where ID in (select StudentID from Inserted)

更复杂的查询需要更多工作来纠正它们。


从您的示例(目前作为答案发布),您有:

if (select studentID from Inserted) <> (select studentId from deleted)

你可以改为:

if exists(select * from inserted i full outer join deleted d on i.StudentID = d.StudentID where i.StudentID is null or d.StudentID is null)

哪些检查可以将已插入的每一行与已删除的行连接,反之亦然。

但是,如果这是触发器的早期部分,则代码中可能还有其他位置只假设inserteddeleted中的一行。他们都需要改变。

重新强调我的第一句话 - SQL Server每个语句触发一次,而不是每行一次。没有办法改变这一点,所以你必须修改你的代码来应对它。