Все, что связано с NULL, приводит к NULL. Обязательно оберните все переменные / поля, объединенные с помощью COALESCE () (также можно использовать ISNULL (), если вы используете SQL Server).
Кстати, циклы и курсоры в триггерах ужасны для производительности. Попробуйте это:
insert into tr_log(description)
SELECT
'Emp with ' + cast(dat2.id as nvarchar(20)) + dat2.[NameChanged] + dat2.[SalaryChanged]
FROM (
SELECT
dat1.*,
CASE
WHEN oldname<>[newname] THEN ' with name ' + ISNULL([oldname],'NULL') + ' has been updated to ' + ISNULL([newname],'NULL')
ELSE ''
END AS [NameChanged],
CASE
WHEN oldsalary<>newsalary THEN ' with salary ' + cast(ISNULL(oldsalary,0) as nvarchar(20))+ ' has been updated to ' + cast(ISNULL(newsalary,0) as nvarchar(20))
ELSE ''
END AS [SalaryChanged]
FROM (
SELECT
i.id AS [ID],i.name AS [newname],i.sal AS [newsalary],d.name AS [oldname],d.sal AS [oldsalary]
FROM inserted i
INNER JOIN deleted d On i.ID=d.ID
) dat1
) dat2