РЕДАКТИРОВАТЬ. Поскольку хранимая процедура уже существует, вы можете встроить аналогичный logi c в SP. Я создал образец хранимой процедуры, которая будет принимать имя сотрудника, обновлять отдел, а затем реализовывать вашу бизнес-логику c. Опять же, укажите в качестве параметра истинное поле первичного ключа (а не имя сотрудника), иначе вы можете обновить несколько записей.
ALTER PROCEDURE UpdateDepartment @EmpName VARCHAR(20), @Dept VARCHAR(20)
AS
BEGIN
DECLARE @Changed TABLE
(
EmpName VARCHAR(20),
OldDepartment VARCHAR(20),
NewDepartment VARCHAR(20),
StartDate DATETIME2,
EndDate DATETIME2
)
UPDATE TempEmployees
SET
Department = @Dept
output
inserted.EmpName,
deleted.Department,
inserted.Department,
inserted.StartDate,
inserted.EndDate
into @Changed
WHERE EmpName = @EmpName
DECLARE @OldDept VARCHAR(20);
SELECT @OldDept = OldDepartment FROM @Changed
UPDATE TempEmployees
SET
EndDate = CURRENT_TIMESTAMP,
Department = @OldDept
WHERE EmpName = @EmpName;
INSERT INTO TempEmployees
SELECT
EmpName,
NewDepartment,
DATEADD(DAY, 1, CURRENT_TIMESTAMP),
'99991231'
FROM @Changed
END
Один из вариантов - использовать триггер и использовать выходные таблицы, которые генерируются оператором UPDATE. Когда выполняется инструкция UPDATE
, генерируются выходные таблицы inserted
и deleted
с подробным описанием состояния записи до и после.
См. Приведенный ниже код и попробуйте изменить его для ваше приложение. Обратите внимание, что текущая версия триггера использует имя сотрудника как часть предиката для обновлений. Если у вас есть более одной записи для указанного c имени сотрудника, они все будут обновлены. Таким образом, имеет смысл использовать истинное поле первичного ключа в таблице, гарантируя, что только обновляется одна запись.
CREATE TRIGGER TempEmployeeMovedDepartment
ON TempEmployees
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF UPDATE(Department)
BEGIN
--Update the End Date for the Current Record. In this case, I'm using the EmpName
--field to denote the record to update. Presumably, you'd have an actual Primary Key
DECLARE @PK VARCHAR(20);
DECLARE @OldDept VARCHAR(20);
SELECT @PK = EmpName, @OldDept = Department FROM deleted;
UPDATE TempEmployees
SET
EndDate = CURRENT_TIMESTAMP,
Department = @OldDept
WHERE EmpName = @PK;
INSERT INTO TempEmployees
SELECT
EmpName,
Department,
DATEADD(DAY, 1, CURRENT_TIMESTAMP),
'99991231'
FROM inserted
END
END