视图基表中的SQL更新行
我有一个视图,它在SQLServer中的两个表之间进行联合。我正在使用一个INSTEADOFUPDATE触发器来更新基表。我编写这段代码是为了更新基表中特定行的Column1,但我得到一个错误:视图基表中的SQL更新行,sql,sql-server,view,Sql,Sql Server,View,我有一个视图,它在SQLServer中的两个表之间进行联合。我正在使用一个INSTEADOFUPDATE触发器来更新基表。我编写这段代码是为了更新基表中特定行的Column1,但我得到一个错误: IF UPDATE(Column1) BEGIN UPDATE BaseTable SET Column1 = I.Column1 FROM inserted I INNER JOIN (SELECT * FROM Table1 UNION ALL
IF UPDATE(Column1)
BEGIN
UPDATE BaseTable
SET Column1 = I.Column1
FROM inserted I INNER JOIN (SELECT * FROM Table1 UNION ALL SELECT * FROM Table2) AS BaseTable
ON I.UniqueID = BaseTable.UniqueID
WHERE BaseTable.UniqueID = I.UniqueID
END
ERROR: Derived table 'Base' is not updatable because a column of the derived table is derived or constant.
错误信息实际上非常清楚。视图/子查询/CTE可更新的要求之一是,每一列都可以与单个表中的单个列相匹配。这就是错误消息试图告诉您的内容 您必须分别更新这些表:
UPDATE t1
SET Column1 = I.Column1
FROM inserted I INNER JOIN
Table1 t1
ON I.UniqueID = t1.UniqueID;
UPDATE t2
SET Column1 = I.Column1
FROM inserted I INNER JOIN
Table2 t2
ON I.UniqueID = t2.UniqueID;
SQL Server只允许
UPDATE
语句更新一个表。在这两个表之间是唯一的UniqueID
。不仅仅是“现在对于当前数据是唯一的”,而且保证是唯一的?如果它们是标识列,则表示您选择了疯狂的路径。这些是生成的唯一字符串,在整个数据库中都是唯一的。您可能希望了解在我的情况下,我不需要更新两个表,而是根据哪个表包含具有指定唯一ID的行来更新其中一个表。我需要在两个表中的一个表中找到UniqueID列与更新行的UniqueID列相同的行。在找到更新的行来自哪个表之后,更新只需要对该表运行一次。有什么简单的方法吗?@AwiringCameron。那又怎么样?(1) 仅更新具有匹配ID的行;如果没有与特定表匹配的行,则不会更新该表中的任何行。(2) inserted
可以包含多行,因此它可能在两个表中都有行。我不知道您的解决方案可以完成所有这些事情。在我看来,两个表中的行是否匹配都会得到更新。谢谢你的帮助,我是SQL新手…很明显!