Не лучшее решение, а просто прямой ответ на вопрос :
SELECT @Key = COALESCE(deleted.id_num,inserted.id_num);
Также не лучшим образом (если не худшим) (не пытайтесь повторить это дома), но по крайней мере это поможет с несколькими значениями :
DECLARE @Key INT;
DECLARE triggerCursor CURSOR LOCAL FAST_FORWARD READ_ONLY
FOR SELECT COALESCE(i.id_num,d.id_num) AS [id_num]
FROM inserted i
FULL JOIN deleted d ON d.id_num = i.id_num
WHERE (
COALESCE(i.fname,'')<>COALESCE(d.fname,'')
OR COALESCE(i.minit,'')<>COALESCE(d.minit,'')
OR COALESCE(i.lname,'')<>COALESCE(d.lname,'')
)
;
OPEN triggerCursor;
FETCH NEXT FROM triggerCursor INTO @Key;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC @ErrCode = dbo.SyncQueueItem 'new_employees', @key;
FETCH NEXT FROM triggerCursor INTO @Key;
END
CLOSE triggerCursor;
DEALLOCATE triggerCursor;
Лучший способ использовать отслеживатель изменения значения на основе триггера:
INSERT INTO [YourTableHistoryName] (id_num, fname, minit, lname, WhenHappened)
SELECT COALESCE(i.id_num,d.id_num) AS [id_num]
,i.fname,i.minit,i.lname,CURRENT_TIMESTAMP AS [WhenHeppened]
FROM inserted i
FULL JOIN deleted d ON d.id_num = i.id_num
WHERE ( COALESCE(i.fname,'')<>COALESCE(d.fname,'')
OR COALESCE(i.minit,'')<>COALESCE(d.minit,'')
OR COALESCE(i.lname,'')<>COALESCE(d.lname,'')
)
;
Лучший (на мой взгляд) способ отслеживать изменения - это использовать временные таблицы (SQL Server 2016 +)