对于执行UPDATE的SQL Server触发器感到困惑(奇怪的UPDATE语句格式)

时间:2013-07-18 17:53:21

标签: sql-server triggers sql-update table-alias

我的问题的关键是触发器中的以下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子句中对象的其他引用必须包含一个   对象别名。

所以......任何人都可以提供清晰的信息吗?

1 个答案:

答案 0 :(得分:-1)

我不确定您是否知道上述查询中的“已插入”或“已删除”不是别名,而是SQL服务器用于跟踪触发器中数据的插入,更新或删除的特殊表。以下是更多信息:

http://msdn.microsoft.com/en-us/library/ms191300.aspx