Я пытался написать хранимую процедуру, в которой я могу выполнить UpSert, используя Merge со следующим условием
Если запись присутствует, измените EndDate цели на вчерашний день, т. е. текущий день - 1.
Если запись отсутствует, вставьте новую запись
Вот таблица tblEmployee, которую я использовал в SP
CREATE TABLE tblEmployee
(
[EmployeeID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](10) NOT NULL,
[StartDate] [date] NOT NULL,
[EndDate] [date] NOT NULL
)
Вот мой SP, который принимает UDTT в качестве входного параметра
CREATE PROCEDURE [dbo].[usp_UpsertEmployees]
@typeEmployee typeEmployee READONLY -- It has same column like tblEmployye except EmployeeID
AS
BEGIN
SET NOCOUNT ON;
MERGE INTO tblEmployee AS TARGET
USING @typeEmployee AS SOURCE
ON TARGET.Name = SOURCE.Name
WHEN MATCHED and TARGET.StartDate < SOURCE.StartDate
THEN
--First Update Existing Record EndDate to Previous Date as shown below
UPDATE
set TARGET.EndDate = DATEADD(day, -1, convert(date, SOURCE.StartDate))
-- Now Insert New Record
--INSERT VALUES(SOURCE.Name, SOURCE.StartDate, SOURCE.EndDate);
WHEN NOT MATCHED by TARGET
THEN
INSERT VALUES(SOURCE.Name, SOURCE.StartDate, SOURCE.EndDate);
SET NOCOUNT OFF;
END
Как я могу выполнить как обновление существующей записи, так и добавление новой записи при совпадении столбца
Может ли кто-нибудь объяснить мне поток выполнения слияния в TSQL, т.е.
WHEN MATCHED --Will this Execute Everytime
WHEN NOT MATCHED by TARGET -- Will this Execute Everytime
WHEN NOT MATCHED by SOURCE -- Will this Execute Everytime
Будут ли все вышеперечисленные 3 условия выполняться каждый раз при слиянии или только условие соответствия выполняется каждый раз
Заранее спасибо