If all you're doing is updates, you can so this with an update trigger and a single update statement:
The trigger:
ALTER TRIGGER upd_PayrollEmployee
ON Payroll_employees
AFTER update
AS
IF COLUMNS_UPDATED() & 2 = 2
INSERT mylog (Date_of_change, Field, OldValue, NewValue)
SELECT GETDATE(), 'firstname', d.firstname, i.firstname
FROM inserted i JOIN deleted d on i.employee_code = d.employee_code
AND d.firstname <> i.firstname
IF COLUMNS_UPDATED() & 4 = 4
INSERT mylog (Date_of_change, Field, OldValue, NewValue)
SELECT GETDATE(), 'surname', d.surname, i.surname
FROM inserted i JOIN deleted d on i.employee_code = d.employee_code
AND d.surname <> i.surname
IF COLUMNS_UPDATED() & 8 = 8
INSERT mylog (Date_of_change, Field, OldValue, NewValue)
SELECT GETDATE(), 'department', d.department, i.department
FROM inserted i JOIN deleted d on i.employee_code = d.employee_code
AND d.department <> i.department
IF COLUMNS_UPDATED() & 16 = 16
INSERT mylog (Date_of_change, Field, OldValue, NewValue)
SELECT GETDATE(), 'email', d.email, i.email
FROM inserted i JOIN deleted d on i.employee_code = d.employee_code
AND d.email <> i.email
GO
The update:
UPDATE Payroll_employees SET
firstname = h.firstname, surname = h.surname, department =h.department , email=h.email
FROM HR_employees h
WHERE Payroll_employees.employee_code = h.employee_code
and (Payroll_employees.firstname <> h.firstname
OR Payroll_employees.surname <> h.surname
OR Payroll_employees.department <> h.department
OR Payroll_employees.email <> h.email)