Я получаю значение NULL в описании для триггера обновления, написанного ниже - PullRequest
0 голосов
/ 03 мая 2018

У меня есть таблица журналов с именем tr_log, в столбце описания которой отражены обновленные данные, но я получаю нулевую запись в таблице. Я сделал операции удаления и вставки, и для этого было вставлено правильное утверждение

enter image description here

    alter trigger tr_trtest_update
    on trtest
    for update 
    as 
    begin
     declare @id int,
     @oldname varchar(20),@newname varchar(20),
 @oldsalary int,@newsalary int
 declare @auditstring varchar(250)
 select * into #tempinserted from inserted 

while(exists( select id from #tempinserted))
begin
set @auditstring='Emp with ' + cast(@id as nvarchar(5))
select top 1 @id=id,@newname=name,@newsalary=sal from #tempinserted
select @oldname=name,@oldsalary=sal from deleted where id=@id 

if  (@oldname<>@newname)
 set @auditstring=@auditstring+ 'with name ' + @oldname + ' has been updated to ' + @newname

if(@oldsalary<>@newsalary)
 set @auditstring=@auditstring+ 'with salary ' + cast(@oldsalary as nvarchar(20))+ 
' has been updated to ' + cast(@newsalary as nvarchar(20))

insert into tr_log(description)values(@auditstring)

delete from #tempinserted where id=@id 
end 
end 

1 Ответ

0 голосов
/ 03 мая 2018

Все, что связано с 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
...