SQL 中的合并语句不适用于 Target 中的删除

Merge Statement in SQL not working for delete in Target

我想使用合并语句将 table PersonalDetails 更新为 STG2PersonalDetails table。 如果 Source 与 PersonalID 匹配,我希望它更新 Target。 如果 PersonalID 上的目标匹配中不存在 Source,我希望它插入到 Target 中。 最后,如果源 table 中不存在 PersonalID,我想从 Target 中删除。 这是我生成的代码,但它不适用于删除。 我想我可能需要在这里添加一些额外的脚本,但我不确定...... 想知道是否有人可以提供帮助。

BEGIN TRAN;
MERGE [dbo].[PersonalDetails] AS T
USING dbo.[STG2PersonalDetails] AS S
ON (T.[PersonalID] = S.[PersonalID]) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT([PersonalID]
      ,[UserName]
      ,[Title]
      ,[Forename]
      ,[PreferredName]
      ,[Surname]
      ,[Postnominal]
      ,[Degree]
      ,[Email]
      ,[Phone]
      ,[UserID]
      ,[UserType]
      ,[LeaveDate]
      ,[Active]
      ,[ProfileStatus]
      ,[ProfileStatusID]) 
      VALUES([PersonalID]
      ,[UserName]
      ,[Title]
      ,[Forename]
      ,[PreferredName]
      ,[Surname]
      ,[Postnominal]
      ,[Degree]
      ,[Email]
      ,[Phone]
      ,[UserID]
      ,[UserType]
      ,[LeaveDate]
      ,[Active]
      ,[ProfileStatus]
      ,[ProfileStatusID])


WHEN MATCHED 
    THEN UPDATE SET 
T.[PersonalID]      =S.[PersonalID],
T.[UserName]        =S.[UserName],
T.[Title]           =S.[Title],
T.[Forename]        =S.[Forename],
T.[PreferredName]   =S.[PreferredName],
T.[Surname]         =S.[Surname],
T.[Postnominal]     =S.[Postnominal],
T.[Degree]          =S.[Degree],
T.[Email]           =S.[Email],
T.[Phone]           =S.[Phone],
T.[UserID]          =S.[UserID],
T.[UserType]        =S.[UserType],
T.[LeaveDate]       =S.[LeaveDate],
T.[Active]          =S.[Active]

WHEN NOT MATCHED BY SOURCE 
    THEN DELETE 
OUTPUT $action, inserted.*, deleted.*;
ROLLBACK TRAN;
GO 

需要添加 COMMIT 而不是 ROLLBACK

BEGIN TRAN;
MERGE [dbo].[PersonalDetails] AS T
USING dbo.[STG2PersonalDetails] AS S
ON (T.[PersonalID] = S.[PersonalID]) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT([PersonalID]
      ,[UserName]
      ,[Title]
      ,[Forename]
      ,[PreferredName]
      ,[Surname]
      ,[Postnominal]
      ,[Degree]
      ,[Email]
      ,[Phone]
      ,[UserID]
      ,[UserType]
      ,[LeaveDate]
      ,[Active]
      ,[ProfileStatus]
      ,[ProfileStatusID]) 
      VALUES([PersonalID]
      ,[UserName]
      ,[Title]
      ,[Forename]
      ,[PreferredName]
      ,[Surname]
      ,[Postnominal]
      ,[Degree]
      ,[Email]
      ,[Phone]
      ,[UserID]
      ,[UserType]
      ,[LeaveDate]
      ,[Active]
      ,[ProfileStatus]
      ,[ProfileStatusID])


WHEN MATCHED 
    THEN UPDATE SET 
T.[PersonalID]      =S.[PersonalID],
T.[UserName]        =S.[UserName],
T.[Title]           =S.[Title],
T.[Forename]        =S.[Forename],
T.[PreferredName]   =S.[PreferredName],
T.[Surname]         =S.[Surname],
T.[Postnominal]     =S.[Postnominal],
T.[Degree]          =S.[Degree],
T.[Email]           =S.[Email],
T.[Phone]           =S.[Phone],
T.[UserID]          =S.[UserID],
T.[UserType]        =S.[UserType],
T.[LeaveDate]       =S.[LeaveDate],
T.[Active]          =S.[Active]

WHEN NOT MATCHED BY SOURCE 
    THEN DELETE 
OUTPUT $action, inserted.*, deleted.*;
COMMIT TRAN;
GO