Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 对执行更新的SQL Server触发器感到困惑(奇怪的UPDATE语句格式)_Sql Server_Triggers_Sql Update_Table Alias - Fatal编程技术网

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

Sql server 对执行更新的SQL Server触发器感到困惑(奇怪的UPDATE语句格式),sql-server,triggers,sql-update,table-alias,Sql Server,Triggers,Sql Update,Table Alias,我的问题的关键是触发器中UPDATE语句的以下样式: update ActualTableName set X=Y from inserted 我本以为这是一个语法错误。。。表ActualTableName未出现在from子句中 所以。。。这只是一种时髦的自动别名展开,即它知道inserted是ActualTableName的别名吗?这似乎不太可能,因为后面的查询见下文 或者。。。还有别的吗。。。与此类似,查询扩展为: update ActualTableName set

我的问题的关键是触发器中UPDATE语句的以下样式:

update ActualTableName 
    set X=Y 
from inserted
我本以为这是一个语法错误。。。表ActualTableName未出现在from子句中

所以。。。这只是一种时髦的自动别名展开,即它知道inserted是ActualTableName的别名吗?这似乎不太可能,因为后面的查询见下文

或者。。。还有别的吗。。。与此类似,查询扩展为:

update ActualTableName 
    set X=Y 
from ActualTableName 
    cross join inserted
对于引用插入表和删除表的更复杂更新,这也有点奇怪:

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子句、one和中多次出现 只有一个,对对象的引用不能指定表别名。全部的 FROM子句中对对象的其他引用必须包含 对象别名


所以。。。是否有人可以清楚地说明发生了什么?

我不确定您是否知道,在上述查询中插入或删除的不是别名,而是SQL server用于跟踪触发器中数据的插入、更新或删除的特殊表。详情如下:


这些查询位于触发器中。。。因此,是的,插入和删除注意,这些名称的正确大小写对于特殊表很重要。如果检查第一个更新查询,我不清楚为什么使用ActualTableName而不是Insert。如果查看第二个更复杂的查询,我很不清楚ActualTableName指的是什么。插入?删除?真正的桌子?如果是真实的表格,该表格如何连接到插入/删除的表格?如果插入或删除,它如何确定是哪一个?如果我们讨论您前面提到的查询update ActualTableName set X=Y from inserted,此处,用户试图使用最近插入到定义触发器的表中的值更新表ActualTableName的X列。您问题中的第一次更新是否有任何条件?在更复杂的更新的where子句中,and后面是什么?或者您可以解释触发器应该处理哪种业务规则?这或许可以解释为什么这些陈述是你看待它们的方式,从而有助于解释它们是如何工作的。