USP_MKTSEGMENTATIONSEGMENTCALCULATEPROCESS_ROLLBACK

Rolls back the changes made while calculating the segment record counts for a marketing effort, if that process fails.

Parameters

Parameter Parameter Type Mode Description
@SEGMENTATIONID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@TRUNCATEDATATABLE bit IN

Definition

Copy


CREATE procedure dbo.[USP_MKTSEGMENTATIONSEGMENTCALCULATEPROCESS_ROLLBACK]
(
  @SEGMENTATIONID uniqueidentifier,
  @CHANGEAGENTID uniqueidentifier = null,
  @TRUNCATEDATATABLE bit = 0
)
as
  set nocount on;

  declare @SQL nvarchar(max);
  declare @DATATABLE nvarchar(128);
  declare @FINDERTABLE nvarchar(128);
  declare @CURRENTDATE datetime;
  declare @SEGMENTID uniqueidentifier;
  declare @SEGMENTTEMP nvarchar(128);
  declare @SEGMENTTEMPNTH nvarchar(128);
  declare @SEGMENTATIONFINDERNUMBERID uniqueidentifier;

  begin try
    if @CHANGEAGENTID is null
      exec dbo.[USP_CHANGEAGENT_GETORCREATECHANGEAGENT] @CHANGEAGENTID output;

    set @CURRENTDATE = getdate();

    set @DATATABLE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME](@SEGMENTATIONID);
    set @FINDERTABLE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKEFINDERTABLENAME](@SEGMENTATIONID);

    -- delete all the segment temporary tables that may still exist


    declare SEGMENTCURSOR cursor local fast_forward for
      select [ID] from dbo.[MKTSEGMENTATIONSEGMENT] where [SEGMENTATIONID] = @SEGMENTATIONID;

    open SEGMENTCURSOR;
    fetch next from SEGMENTCURSOR into @SEGMENTID;

    while (@@FETCH_STATUS = 0)
    begin
      set @SEGMENTTEMP = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETEMPSEGMENTTABLENAME](@SEGMENTID);
      if exists(select top 1 1 from tempdb.[INFORMATION_SCHEMA].[TABLES] where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @SEGMENTTEMP)
        begin
          set @SQL = 'drop table dbo.[' + @SEGMENTTEMP + ']';
          exec (@SQL);
        end

      set @SEGMENTTEMPNTH = '##TEMP_NTH_' + replace(cast(@SEGMENTID as nvarchar(36)), '-', '_');
      if exists(select top 1 1 from tempdb.[INFORMATION_SCHEMA].[TABLES] where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @SEGMENTTEMPNTH)
        begin
          set @SQL = 'drop table dbo.[' + @SEGMENTTEMPNTH + ']';
          exec (@SQL);
        end

      exec dbo.[USP_MKTSEGMENTATIONSEGMENT_CLEARCACHE] @SEGMENTID, 0, 0;

      fetch next from SEGMENTCURSOR into @SEGMENTID;
    end

    close SEGMENTCURSOR;
    deallocate SEGMENTCURSOR;

    if exists(select top 1 1 from [INFORMATION_SCHEMA].[TABLES] where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @DATATABLE)
      begin
        -- truncate the mailing activated data table

        if @TRUNCATEDATATABLE = 1
          exec dbo.[USP_MKTSEGMENTATION_TRUNCATEDATATABLE] @SEGMENTATIONID;
        else
          begin
            --Remove any rows with a null finder number because they haven't been fully calculated anyway...

            set @SQL = 'delete from dbo.[' + @DATATABLE + '] where [FINDERNUMBER] is null';
            exec (@SQL);
          end
      end

      set @SQL = 'if object_id(''tempdb..##' + @FINDERTABLE + ''') is not null' + char(13) +
                  '  drop table dbo.[##' + @FINDERTABLE + '];';
      exec (@SQL);

    exec dbo.[USP_MKTSEGMENTATION_CLEARCACHE] @SEGMENTATIONID, 0;
  end try

  begin catch
    exec dbo.[USP_RAISE_ERROR];
    return 1;
  end catch

  return 0;