0

我的问题的症结是触发器中的以下 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 子句中对对象的所有其他引用都必须包含对象别名。

那么......任何人都可以提供清楚的情况吗?

4

1 回答 1

-1

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

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

于 2013-07-18T18:44:15.873 回答