我的问题的症结是触发器中的以下 UPDATE 语句样式:
update ActualTableName
set X=Y
from inserted
我会认为这是一个语法错误......表“ActualTableName”没有出现在“from”子句中。
所以...这只是某种时髦的自动别名“unwind”(即它知道“inserted”是 ActualTableName 的别名吗?这似乎不太可能因为稍后的查询(见下文)。
或者......还有更多......就像查询扩展到:
update ActualTableName
set X=Y
from ActualTableName
cross join inserted
这对于引用插入和删除表的更复杂的 UPDATE 也有点陌生:
update ActualTableName
set [... some assignments ...]
from
inserted
left outer join deleted
on inserted.Id = deleted.Id
and inserted.SomeField > deleted.SomeField
where
inserted.Id <> ActualTableName.Id and
此查询似乎正在更新 ActualTableName 中不属于插入表的记录......这让我认为实际查询是:
update ActualTableName
set [... some assignments ...]
from
ActualTableName
cross jon inserted
left outer join deleted
on inserted.Id = deleted.Id
and inserted.SomeField > deleted.SomeField
where
inserted.Id <> ActualTableName.Id and
网上的书对此有点不透明,并说:
如果要更新的对象与 FROM 子句中的对象相同,并且 FROM 子句中只有一个对该对象的引用,则可以指定也可以不指定对象别名。如果正在更新的对象在 FROM 子句中出现多次,并且只有一次,则对该对象的引用不得指定表别名。FROM 子句中对对象的所有其他引用都必须包含对象别名。
那么......任何人都可以提供清楚的情况吗?