2013-07-18 58 views
0

我的问题的症结是UPDATE语句的触发以下样式:困惑的SQL Server触发器,做一个UPDATE(奇怪的UPDATE语句格式)

update ActualTableName 
    set X=Y 
from inserted 

我还以为这是一个语法错误...表“ActualTableName”没有出现在“from”子句中。

所以......这只是某种时髦的自动别名“开卷”(即它知道“插入”是ActualTableName别名?这似乎是因为稍后查询的可能性不大(见下文)。

还是......有更多的东西......像查询被扩展为:

update ActualTableName 
    set X=Y 
from ActualTableName 
    cross join inserted 

这也变得有点陌生了更复杂的更新同时引用inserted和deleted表:

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

是否在你的问题的第一次更新有什么条件?在“更复杂的UPDATE”'where子句中的'和'后面是什么?或者,也许你可以解释触发器应该处理什么样的业务规则?这可能会阐明为什么这些陈述是你看到他们的方式(可能有助于解释他们的工作方式)。 –

回答

-1

我不确定您是否意识到上述查询中的插入或删除不是别名,而是SQL服务器用于跟踪插入,更新或删除触发器中的数据的特殊表。下面是详细信息:

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

+0

这些查询是在一个触发器...所以是插入和删除(注意这些名称的正确的框是重要的)是特殊的表。如果您检查第一个更新查询,我不清楚为什么使用“ActualTableName”而不是“插入”。如果您查看第二个更复杂的查询,那么ActualTableName引用的内容很不清楚。插入?删除吗?真正的桌子?如果真正的表是如何加入到插入/删除?如果插入或删除,它如何确定哪一个? – user505765

+0

如果我们讨论先前提到的查询(更新ActualTableName 从插入中设置X = Y ),则此处用户试图使用最近插入的值更新表“ActualTableName”的列“X”在哪个表上定义了触发器。 – Sonam