В триггере есть функция, которую вы можете вызвать COLUMS_UPDATED (). Это возвращает растровое изображение столбцов в таблице триггеров, где 1 указывает, что соответствующий столбец в таблице был изменен. Само по себе это не блестяще, так как вы получили бы список индексов столбцов и все равно должны были бы написать оператор CASE, чтобы определить, какие столбцы были изменены. Если у вас не так много столбцов, которые могут быть не такими уж плохими, но если вы хотите что-то более общее, вы можете присоединиться к information_schema.columns для преобразования индексов этих столбцов в имена столбцов
Вот небольшой пример, показывающий, что вы можете сделать:
CREATE TABLE test (
ID Int NOT null IDENTITY(1,1),
NAME VARCHAR(50),
Age INT
)
GO
---------------------------------------
CREATE TRIGGER tr_test ON test FOR UPDATE
AS
DECLARE @cols varbinary= COLUMNS_UPDATED()
DECLARE @altered TABLE(colid int)
DECLARE @index int=1
WHILE @cols>0 BEGIN
IF @cols & 1 <> 0 INSERT @altered(colid) VALUES(@index)
SET @index=@index+1
SET @cols=@cols/2
END
DECLARE @text varchar(MAX)=''
SELECT @text=@text+C.COLUMN_NAME+', '
FROM information_schema.COLUMNS C JOIN @altered A ON c.ordinal_position=A.colid
WHERE table_name='test'
PRINT @text
GO
------------------------------------------------------
INSERT test(NAME, age) VALUES('test',12)
UPDATE test SET age=15
UPDATE test SET NAME='fred'
UPDATE test SET age=18,NAME='bert'
DROP TABLE test