Запускать функции UPDATE () и COLUMNS_UPDATED () - PullRequest
5 голосов
/ 02 сентября 2011

У меня есть триггер AFTER UPDATE для таблицы.

Мне нужно получить имя изменяющегося столбца и его старые и новые значения.

Чтобы сделать оператор UPDATE(column_name) с каждым столбцом в кодеплохое решение.Но я не могу получить все имена столбцов таблицы с помощью запроса

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.Columns 
WHERE TABLE_NAME = 'smth'

и в курсоре динамически получить значение UPDATE(@column_name).

В то же время, когда я пытаюсь использовать функцию COLUMNS_UPDATED(), когдаЯ обновляю только один столбец в таблице, у меня есть результаты (значение, преобразованное в int):

64 (Updated column with ORDINAL_POSITION = 31)
32 (Updated column with ORDINAL_POSITION = 30)
8 (Updated column with ORDINAL_POSITION = 29)
4 (Updated column with ORDINAL_POSITION = 28)
2 (Updated column with ORDINAL_POSITION = 27)
1 (Updated column with ORDINAL_POSITION = 26)
32768 (Updated column with ORDINAL_POSITION = 25)

Я думаю, что это очень странно, и прошу вашей помощи.

Ответы [ 2 ]

5 голосов
/ 02 сентября 2011

Странно это или нет, но по крайней мере задокументировано :

Внимание

В SQL Server 2008 столбец ORDINAL_POSITION представления INFORMATION_SCHEMA.COLUMNS не совместим с битовой комбинацией столбцов, возвращаемых функцией COLUMNS_UPDATED. Чтобы получить битовый шаблон, совместимый с COLUMNS_UPDATED, обратитесь к свойству ColumnID системной функции COLUMNPROPERTY при запросе представления INFORMATION_SCHEMA.COLUMNS, как показано в следующем примере.

SELECT TABLE_NAME, COLUMN_NAME,
    COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME),
    COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM AdventureWorks2008R2.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Contact';
4 голосов
/ 02 сентября 2011

UPDATE () вернет true, если на столбец есть ссылка, не имеет значения, изменилось ли значение

, поэтому, если вы выполните

update table BLa
set Col1 = Col1

в триггере UPDATE() вернет true для этого столбца

, объединит псевдотаблицы inserted и deleted в триггере и проверит, что значения не изменились, и, конечно же, обязательно учтем значения NULL ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...