USP_MKTSEGMENTATION_CLEARCACHE

Clears the marketing effort segment cache tables for a marketing effort.

Parameters

Parameter Parameter Type Mode Description
@SEGMENTATIONID uniqueidentifier IN
@QUICKDELETE bit IN
@SKIPADDRESSCACHETABLE bit IN

Definition

Copy


CREATE procedure dbo.[USP_MKTSEGMENTATION_CLEARCACHE]
(
  @SEGMENTATIONID uniqueidentifier,
  @QUICKDELETE bit = 0,
  @SKIPADDRESSCACHETABLE bit = 0
)
as
  set nocount on;

  declare @TABLENAME nvarchar(128);
  declare @SQL nvarchar(max);

  declare @LOCKPREFIX nvarchar(50);
  declare @LOCKNAME nvarchar(255);
  declare @LOCKRESULT int;
  declare @LOCKNAMES table([LOCKNAME] nvarchar(255), [SEQUENCE] int);
  declare @RETVAL int;

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

    set @LOCKPREFIX = 'SegmentExclusionCache:';

    /* get an app lock for each segment so that we don't run into problems when this SP gets called while trying to cache values for this segment */
    insert into @LOCKNAMES
      select @LOCKPREFIX + cast([MKTSEGMENTATIONSEGMENT].[ID] as nvarchar(36)), [MKTSEGMENTATIONSEGMENT].[SEQUENCE]
      from dbo.[MKTSEGMENTATIONSEGMENT]
      where [SEGMENTATIONID] = @SEGMENTATIONID;

    declare GETLOCKCURSOR cursor local fast_forward for
      select [LOCKNAME]
      from @LOCKNAMES
      order by [SEQUENCE];

    open GETLOCKCURSOR;
    fetch next from GETLOCKCURSOR into @LOCKNAME;

    while (@@FETCH_STATUS = 0)
    begin
      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);
      fetch next from GETLOCKCURSOR into @LOCKNAME;
    end

    close GETLOCKCURSOR;
    deallocate GETLOCKCURSOR;


    /* Delete all the cache info records for this mailing */
    delete from dbo.[MKTSEGMENTATIONSEGMENTCACHEINFO]
    where [SEGMENTID] in (select [ID] from dbo.[MKTSEGMENTATIONSEGMENT] where [SEGMENTATIONID] = @SEGMENTATIONID);


    /* Only skip this when needed because we need this table to stay around after activation. */
    if @SKIPADDRESSCACHETABLE = 0
      begin
        /* Delete all the records for this mailing in the address cache table. */
        set @TABLENAME = dbo.[UFN_MKTSEGMENTATIONSEGMENTCACHEADDRESSES_MAKETABLENAME](@SEGMENTATIONID);
        if exists(select * from [INFORMATION_SCHEMA].[TABLES] where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @TABLENAME)
          begin
            set @SQL = 'truncate table dbo.[' + @TABLENAME + ']';
            exec (@SQL);
          end

        /* Delete all the records for this mailing in the email address cache table. */
        set @TABLENAME = dbo.[UFN_MKTSEGMENTATIONSEGMENTCACHEEMAILADDRESSES_MAKETABLENAME](@SEGMENTATIONID);
        if exists(select * from [INFORMATION_SCHEMA].[TABLES] where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @TABLENAME)
          begin
            set @SQL = 'truncate table dbo.[' + @TABLENAME + ']';
            exec (@SQL);
          end
      end
  end try

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


  /* Release all the app locks */
  declare RELEASELOCKCURSOR cursor local fast_forward for
    select [LOCKNAME]
    from @LOCKNAMES
    order by [SEQUENCE];

  open RELEASELOCKCURSOR;
  fetch next from RELEASELOCKCURSOR into @LOCKNAME;

  while (@@FETCH_STATUS = 0)
  begin
    exec sp_releaseapplock @Resource=@LOCKNAME, @LockOwner='Session';
    fetch next from RELEASELOCKCURSOR into @LOCKNAME;
  end

  close RELEASELOCKCURSOR;
  deallocate RELEASELOCKCURSOR;

  return isnull(@RETVAL, 0);