2016-11-08 6 views
2

Я хочу использовать оператор слияния для обновления таблицы PersonalDetails с помощью таблицы STG2PersonalDetails. Я хочу, чтобы он обновлял Target, если Source присутствует на PersonalID. Я хочу, чтобы он вставлялся в Target, если Source отсутствует в целевом сопоставлении на PersonalID. Последнее, я хочу удалить из Target, если PersonalID отсутствует в исходной таблице. Это код, который я сгенерировал, но его не работает для удаления. Думаю, мне может понадобиться добавить немного дополнительного скрипта здесь, но я не уверен ..... Удивительно, может ли кто-нибудь помочь.Заявление о слиянии в SQL, не работающем для удаления в 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 
+0

Я не использую Talend, я использую SSMS –

+0

Таким образом, вы в значительной степени требуется таблица PersonalDetails иметь точно такое же содержание, что и таблица STG2PersonalDetails? –

ответ

1

Необходимо, чтобы добавить 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