CREATE PROCEDURE [dbo].[Add_FormStatisticsByContact] @ContactId [uniqueidentifier], @FormId [uniqueidentifier], @LastInteractionDate [datetime], @Submits [int], @Success [int], @Dropouts [int], @Failures [int], @Visits [int], @Value [int], @FinalResult [int] AS BEGIN SET NOCOUNT ON; BEGIN TRY MERGE [dbo].[Fact_FormStatisticsByContact] AS t USING ( VALUES ( @ContactId, @FormId, @LastInteractionDate, @Submits, @Success, @Dropouts, @Failures, @Visits, @Value, @FinalResult ) ) as s ( [ContactId], [FormId], [LastInteractionDate], [Submits], [Success], [Dropouts], [Failures], [Visits], [Value], [FinalResult] ) ON ( t.[ContactId] = s.[ContactId] AND t.[FormId] = s.[FormId] ) WHEN MATCHED and (t.[LastInteractionDate] < s.[LastInteractionDate]) THEN UPDATE SET t.[LastInteractionDate] = s.[LastInteractionDate], t.[Submits] = s.[Submits], t.[Success] = s.[Success], t.[Dropouts] = s.[Dropouts], t.[Failures] = s.[Failures], t.[Visits] = s.[Visits], t.[Value] = s.[Value], t.[FinalResult] = s.[FinalResult] WHEN NOT MATCHED THEN INSERT( [ContactId], [FormId], [LastInteractionDate], [Submits], [Success], [Dropouts], [Failures], [Visits], [Value], [FinalResult] ) VALUES( s.[ContactId], s.[FormId], s.[LastInteractionDate], s.[Submits], s.[Success], s.[Dropouts], s.[Failures], s.[Visits], s.[Value], s.[FinalResult] ); END TRY BEGIN CATCH DECLARE @error_number INTEGER = ERROR_NUMBER(); DECLARE @error_severity INTEGER = ERROR_SEVERITY(); DECLARE @error_state INTEGER = ERROR_STATE(); DECLARE @error_message NVARCHAR(4000) = ERROR_MESSAGE(); DECLARE @error_procedure SYSNAME = ERROR_PROCEDURE(); DECLARE @error_line INTEGER = ERROR_LINE(); RAISERROR( N'T-SQL ERROR %d, SEVERITY %d, STATE %d, PROCEDURE %s, LINE %d, MESSAGE: %s', @error_severity, 1, @error_number, @error_severity, @error_state, @error_procedure, @error_line, @error_message ) WITH NOWAIT; END CATCH; END; GO