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
我想使用合并语句将 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