我的问题的关键是触发器中的以下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子句中对象的其他引用必须包含一个 对象别名。
所以......任何人都可以提供清晰的信息吗?
答案 0 :(得分:-1)
我不确定您是否知道上述查询中的“已插入”或“已删除”不是别名,而是SQL服务器用于跟踪触发器中数据的插入,更新或删除的特殊表。以下是更多信息: