USP_MKTSEGMENTATIONSEGMENT_CLEARCACHE

Clears the marketing effort segment cache tables for a specific segment and all segments after it.

Parameters

Parameter Parameter Type Mode Description
@SEGMENTID uniqueidentifier IN
@ONLYCLEARSAMERECORDTYPE bit IN
@QUICKDELETE bit IN

Definition

Copy


CREATE procedure dbo.[USP_MKTSEGMENTATIONSEGMENT_CLEARCACHE]
(
  @SEGMENTID uniqueidentifier,
  @ONLYCLEARSAMERECORDTYPE bit = 0,
  @QUICKDELETE bit = 0
)
as
  set nocount on;

  declare @SEGMENTATIONID uniqueidentifier;
  declare @SEQUENCE int;
  declare @RECORDTYPEID uniqueidentifier;
  declare @RECORDSOURCETYPE tinyint;
  declare @TABLENAME nvarchar(128);
  declare @SQL nvarchar(max);

  declare @LOCKPREFIX nvarchar(50);
  declare @LOCKNAME nvarchar(255);
  declare @LOCKRESULT int;
  declare @RETVAL int;

  begin try
    if @ONLYCLEARSAMERECORDTYPE is null
      set @ONLYCLEARSAMERECORDTYPE = 0;
    if @QUICKDELETE is null
      set @QUICKDELETE = 0;

    set @LOCKPREFIX = 'SegmentExclusionCache:';

    /* Get an app lock for this segment so that we don't run into problems when this SP gets called while trying to cache values for this segment. */
    set @LOCKNAME = @LOCKPREFIX + cast(@SEGMENTID as nvarchar(36));
    exec @LOCKRESULT = sp_getapplock @Resource=@LOCKNAME, @LockMode='Exclusive', @LockOwner='Session', @LockTimeout=3600000;
    if @LOCKRESULT < 0
      raiserror('A failure or timeout occurred while requesting an app lock to clear a marketing effort segment''s cache.', 13, 1);


    select
      @SEGMENTATIONID = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID],
      @SEQUENCE = [MKTSEGMENTATIONSEGMENT].[SEQUENCE],
      @RECORDTYPEID = [IDSETREGISTER].[RECORDTYPEID],
      @RECORDSOURCETYPE = dbo.[UFN_MKTSEGMENT_GETMARKETINGRECORDTYPE]([MKTSEGMENT].[ID])
    from dbo.[MKTSEGMENTATIONSEGMENT]
    inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID]
    inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
    inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENT].[IDSETREGISTERID]
    where [MKTSEGMENTATIONSEGMENT].[ID] = @SEGMENTID;


    /* Build the sql of segments to clear */
    set @SQL = 'declare @SEGMENTS table([ID] uniqueidentifier primary key);' + char(13) +
               char(13) +
               'insert into @SEGMENTS ([ID])' + char(13) +
               '  select [MKTSEGMENTATIONSEGMENT].[ID]' + char(13) +
               '  from dbo.[MKTSEGMENTATIONSEGMENT]' + char(13) +
               '  inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]' + char(13) +
               '  left join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]' + char(13);

    if @ONLYCLEARSAMERECORDTYPE = 1
      set @SQL = @SQL +
                 '  inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENT].[IDSETREGISTERID]' + char(13);

    set @SQL = @SQL +
               '  where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID' + char(13) +
               '  and ([MKTSEGMENT].[SEGMENTTYPECODE] <> 2 or ([MKTSEGMENT].[SEGMENTTYPECODE] = 2 and [MKTSEGMENTLIST].[TYPECODE] <> 1))  --exclude vendor managed segments' + char(13) +

               '  and [MKTSEGMENTATIONSEGMENT].[SEQUENCE] >= @SEQUENCE';

    if @ONLYCLEARSAMERECORDTYPE = 1
      begin
        --Need to clear all segments with the same record type or the consolidated recordtype for the related record source...

        if @RECORDSOURCETYPE = 1  --House file

          set @SQL = @SQL + char(13) +
                     '  and ([IDSETREGISTER].[RECORDTYPEID] = @RECORDTYPEID' + char(13) +
                     '    or exists(' + char(13) +
                     '      select 1' + char(13) +
                     '      from dbo.[QUERYVIEWCATALOG]' + char(13) +
                     '      inner join dbo.[MKTCONSOLIDATEDQUERYVIEWSPEC] on [MKTCONSOLIDATEDQUERYVIEWSPEC].[ID] = [QUERYVIEWCATALOG].[ID]' + char(13) +
                     '      inner join dbo.[QUERYVIEWCATALOG] as [CQV] on [CQV].[ID] = [MKTCONSOLIDATEDQUERYVIEWSPEC].[CONSOLIDATEDQUERYVIEWCATALOGID]' + char(13) +
                     '      where [QUERYVIEWCATALOG].[RECORDTYPEID] = @RECORDTYPEID' + char(13) +
                     '      and [CQV].[RECORDTYPEID] = [IDSETREGISTER].[RECORDTYPEID]' + char(13) +
                     '    )' + char(13) +
                     '  )';
        else
          begin
            if @RECORDSOURCETYPE = 2  --List

              set @SQL = @SQL + char(13) +
                         '  and ([IDSETREGISTER].[RECORDTYPEID] = @RECORDTYPEID' + char(13) +
                         '    or exists(' + char(13) +
                         '      select 1' + char(13) +
                         '      from dbo.[QUERYVIEWCATALOG]' + char(13) +
                         '      inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[QUERYVIEWCATALOGID] = [QUERYVIEWCATALOG].[ID]' + char(13) +
                         '      inner join dbo.[QUERYVIEWCATALOG] as [CQV] on [CQV].[ID] = [MKTSEGMENTLIST].[CONSOLIDATEDQUERYVIEWID]' + char(13) +
                         '      where [QUERYVIEWCATALOG].[RECORDTYPEID] = @RECORDTYPEID' + char(13) +
                         '      and [CQV].[RECORDTYPEID] = [IDSETREGISTER].[RECORDTYPEID]' + char(13) +
                         '    )' + char(13) +
                         '  )';
            else  --Consolidated list

              set @SQL = @SQL + char(13) +
                         '  and ([IDSETREGISTER].[RECORDTYPEID] = @RECORDTYPEID' + char(13) +
                         '    or [IDSETREGISTER].[RECORDTYPEID] in (' + char(13) +
                         '      select [HQV].[RECORDTYPEID]' + char(13) +
                         '      from dbo.[QUERYVIEWCATALOG]' + char(13) +
                         '      inner join dbo.[MKTCONSOLIDATEDQUERYVIEWSPEC] on [MKTCONSOLIDATEDQUERYVIEWSPEC].[CONSOLIDATEDQUERYVIEWCATALOGID] = [QUERYVIEWCATALOG].[ID]' + char(13) +
                         '      inner join dbo.[QUERYVIEWCATALOG] as [HQV] on [HQV].[ID] = [MKTCONSOLIDATEDQUERYVIEWSPEC].[ID]' + char(13) +
                         '      where [QUERYVIEWCATALOG].[RECORDTYPEID] = @RECORDTYPEID' + char(13) +
                         '      union all' + char(13) +
                         '      select [LQV].[RECORDTYPEID]' + char(13) +
                         '      from dbo.[QUERYVIEWCATALOG]' + char(13) +
                         '      inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[CONSOLIDATEDQUERYVIEWID] = [QUERYVIEWCATALOG].[ID]' + char(13) +
                         '      inner join dbo.[QUERYVIEWCATALOG] as [LQV] on [LQV].[ID] = [MKTSEGMENTLIST].[QUERYVIEWCATALOGID]' + char(13) +
                         '      where [QUERYVIEWCATALOG].[RECORDTYPEID] = @RECORDTYPEID' + char(13) +
                         '    )' + char(13) +
                         '  )';
          end
      end

    /* Delete all the cache info records for this segment and any segments after it because they will be invalid now */
    set @SQL = @SQL + ';' + char(13) +
               char(13) +
               'delete from dbo.[MKTSEGMENTATIONSEGMENTCACHEINFO]' + char(13) +
               'where [SEGMENTID] in (select [ID] from @SEGMENTS);' + char(13);

    /* This can be slow for large mailings, so only do this when we need to */
    if @QUICKDELETE = 0
      begin
        /* Delete all the records for this segment in each of the cache tables below */
        set @TABLENAME = dbo.[UFN_MKTSEGMENTATIONSEGMENTCACHEADDRESSES_MAKETABLENAME](@SEGMENTATIONID);
        if exists(select 1 from [INFORMATION_SCHEMA].[TABLES] where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @TABLENAME)
          set @SQL = @SQL + char(13) +
                     'delete from dbo.[' + @TABLENAME + ']' + char(13) +
                     'where [SEGMENTID] in (select [ID] from @SEGMENTS);' + char(13);

        set @TABLENAME = dbo.[UFN_MKTSEGMENTATIONSEGMENTCACHEEMAILADDRESSES_MAKETABLENAME](@SEGMENTATIONID);
        if exists(select 1 from [INFORMATION_SCHEMA].[TABLES] where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @TABLENAME)
         set @SQL = @SQL + char(13) +
                     'delete from dbo.[' + @TABLENAME + ']' + char(13) +
                     'where [SEGMENTID] in (select [ID] from @SEGMENTS);' + char(13);
      end

    exec sp_executesql @SQL, N'@SEGMENTATIONID uniqueidentifier, @SEQUENCE int, @RECORDTYPEID uniqueidentifier', @SEGMENTATIONID = @SEGMENTATIONID, @SEQUENCE = @SEQUENCE, @RECORDTYPEID = @RECORDTYPEID;
  end try

  begin catch
    exec dbo.[USP_RAISE_ERROR];
    set @RETVAL = 1;
  end catch

  /* Release the app lock */
  exec sp_releaseapplock @Resource=@LOCKNAME, @LockOwner='Session';

  return isnull(@RETVAL, 0);