2013-07-18 56 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