4

次の条件で Merge を使用して UpSert を実行できるストアド プロシージャを作成しようとしています。

  1. Record が Present の場合、Target の EndDate を昨日の日に変更します。つまり、現在の日 - 1

  2. レコードが存在しない場合、新しいレコードを挿入

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 で毎回実行されますか、それとも一致する条件のみが毎回実行されますか

前もって感謝します

4

2 に答える 2