Запутался в триггере SQL Server, который выполняет UPDATE (странный формат оператора UPDATE)

Суть моего вопроса - следующий стиль оператора UPDATE в триггере:

update ActualTableName 
    set X=Y 
from inserted

Я бы подумал, что это синтаксическая ошибка... таблица "ActualTableName" не появляется в предложении "from".

Итак... это просто какой-то фанкий автоматический псевдоним "unwind" (то есть он знает, что "вставленный" является псевдонимом для 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 ответ

Я не уверен, что вам известно о том факте, что Inserted или Deleted в вышеупомянутых запросах являются не псевдонимами, а специальными таблицами, используемыми сервером SQL для отслеживания вставки, обновления или удаления данных в триггерах. Вот больше информации:

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

Другие вопросы по тегам