次の条件で Merge を使用して UpSert を実行できるストアド プロシージャを作成しようとしています。
Record が Present の場合、Target の EndDate を昨日の日に変更します。つまり、現在の日 - 1
レコードが存在しない場合、新しいレコードを挿入
SPで使用したテーブルtblEmployeeは次のとおりです
CREATE TABLE tblEmployee
(
[EmployeeID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](10) NOT NULL,
[StartDate] [date] NOT NULL,
[EndDate] [date] NOT NULL
)
UDTT を入力パラメーターとして使用する SP を次に示します。
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 つの条件はすべて Merge で毎回実行されますか、それとも一致する条件のみが毎回実行されますか
前もって感謝します