USP_MKTSEGMENTLIST_DELETEIMPORTDATA

Deletes all the import data associated with a list segment.

Parameters

Parameter Parameter Type Mode Description
@SEGMENTID uniqueidentifier IN
@CURRENTAPPUSERID uniqueidentifier IN
@DELETINGSEGMENT bit IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.[USP_MKTSEGMENTLIST_DELETEIMPORTDATA]
(
  @SEGMENTID uniqueidentifier,
  @CURRENTAPPUSERID uniqueidentifier,
  @DELETINGSEGMENT bit,
  @CHANGEAGENTID uniqueidentifier = null
)
as
  set nocount on;

  declare @SEGMENTLISTID uniqueidentifier;
  declare @QUERYVIEWCATALOGID as uniqueidentifier;
  declare @STANDARDIDSETID uniqueidentifier;
  declare @DUPLICATEIDSETID uniqueidentifier;
  declare @IDSETRECORDTYPEID uniqueidentifier;
  declare @RECORDSOURCEID uniqueidentifier;
  declare @QUERYVIEWS table([ID] uniqueidentifier primary key, [RECORDTYPEID] uniqueidentifier);

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

    select
      @SEGMENTLISTID = [MKTSEGMENTLIST].[ID],
      @QUERYVIEWCATALOGID = [MKTSEGMENTLIST].[QUERYVIEWCATALOGID],
      @STANDARDIDSETID = [MKTSEGMENTLIST].[STANDARDIDSETID],
      @DUPLICATEIDSETID = [MKTSEGMENTLIST].[DUPLICATEIDSETID],
      @IDSETRECORDTYPEID = [MKTSEGMENTLIST].[IDSETRECORDTYPEID],
      @RECORDSOURCEID = [MKTLIST].[RECORDSOURCEID]
    from dbo.[MKTSEGMENT]
    inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
    inner join dbo.[MKTLIST] on [MKTLIST].[ID] = [MKTSEGMENTLIST].[LISTID]
    where [MKTSEGMENT].[ID] = @SEGMENTID;


    if @DELETINGSEGMENT = 1
      --Grab all the different query views for this segment so we know what to clean up...

      insert into @QUERYVIEWS ([ID], [RECORDTYPEID])
        select
          [QUERYVIEWCATALOG].[ID],
          [QUERYVIEWCATALOG].[RECORDTYPEID]
        from dbo.[MKTSEGMENTLIST]
        inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTSEGMENTLIST].[QUERYVIEWCATALOGID]
        where [SEGMENTID] = @SEGMENTID;
    else if @QUERYVIEWCATALOGID is not null and @IDSETRECORDTYPEID is not null
      --Grab just the one query view for this list segment...

      insert into @QUERYVIEWS (
        [ID],
        [RECORDTYPEID]
      ) values (
        @QUERYVIEWCATALOGID,
        @IDSETRECORDTYPEID
      );


    --Set all IDSet related values to null so we don't invalidate any foreign key relationships when the queries are deleted.

    --Do not clear the QUERYVIEWCATALOGID field except when deleting the entire segment because we need it for activated mailings.

    update dbo.[MKTSEGMENTLIST] set
      [STANDARDIDSETID] = null,
      [DUPLICATEIDSETID] = null,
      [IDSETRECORDTYPEID] = null,
      [CONSOLIDATEDQUERYVIEWID] = null,
      [CHANGEDBYID] = @CHANGEAGENTID,
      [DATECHANGED] = getdate()
    where (@DELETINGSEGMENT = 0 and [ID] = @SEGMENTLISTID)
    or (@DELETINGSEGMENT = 1 and [SEGMENTID] = @SEGMENTID);


    /****************************************************/
    /* Delete the list segment deduplication process... */
    /****************************************************/
    declare @SEGMENTLISTDEDUPEPROCESSID uniqueidentifier;

    select @SEGMENTLISTDEDUPEPROCESSID = [ID]
    from dbo.[MKTSEGMENTLISTDEDUPEPROCESS]
    where [SEGMENTLISTID] = @SEGMENTLISTID;

    if @SEGMENTLISTDEDUPEPROCESSID is not null
      exec dbo.[USP_MKTSEGMENTLISTDEDUPEPROCESS_DELETEBYID_WITHCHANGEAGENTID] @SEGMENTLISTDEDUPEPROCESSID, @CHANGEAGENTID;


    /*********************************************/
    /* Delete the list segment import process... */
    /*********************************************/
    declare @SEGMENTLISTIMPORTPROCESSID uniqueidentifier;

    select @SEGMENTLISTIMPORTPROCESSID = [ID]
    from dbo.[MKTSEGMENTLISTIMPORTPROCESS]
    where [SEGMENTLISTID] = @SEGMENTLISTID;

    if @SEGMENTLISTIMPORTPROCESSID is not null
      exec dbo.[USP_MKTSEGMENTLISTIMPORTPROCESS_DELETEBYID_WITHCHANGEAGENTID] @SEGMENTLISTIMPORTPROCESSID, @CHANGEAGENTID;


    if @DELETINGSEGMENT = 1
      begin
        /***************************************************************************/
        /* Delete all ad-hoc queries and their IDSets associated with this list... */
        /***************************************************************************/
        declare @ADHOCQUERYID uniqueidentifier;
        declare ADHOCQUERYCURSOR cursor local fast_forward for
          select [ID]
          from dbo.[ADHOCQUERY]
          where [QUERYVIEWCATALOGID] in (select [ID] from @QUERYVIEWS);

        open ADHOCQUERYCURSOR;
        fetch next from ADHOCQUERYCURSOR into @ADHOCQUERYID;

        while (@@FETCH_STATUS = 0)
        begin
          exec dbo.[USP_ADHOCQUERY_DELETE] @ADHOCQUERYID, @CURRENTAPPUSERID, @CHANGEAGENTID;
          fetch next from ADHOCQUERYCURSOR into @ADHOCQUERYID;
        end

        close ADHOCQUERYCURSOR;
        deallocate ADHOCQUERYCURSOR;


        /***************************************************************************/
        /* Delete any query view relationships along with the actual query view... */
        /***************************************************************************/
        declare @QUERYVIEWRELATIONSHIPID uniqueidentifier;
        declare QUERYVIEWRELATIONSHIPCURSOR cursor local fast_forward for
          select [ID]
          from dbo.[QUERYVIEWRELATIONSHIP]
          where [ROOTQUERYVIEWID] in (select [ID] from @QUERYVIEWS);

        open QUERYVIEWRELATIONSHIPCURSOR;
        fetch next from QUERYVIEWRELATIONSHIPCURSOR into @QUERYVIEWRELATIONSHIPID;

        while (@@FETCH_STATUS = 0)
        begin
          exec dbo.[USP_QUERYVIEWRELATIONSHIP_DELETEBYID_WITHCHANGEAGENTID] @QUERYVIEWRELATIONSHIPID, @CHANGEAGENTID;
          fetch next from QUERYVIEWRELATIONSHIPCURSOR into @QUERYVIEWRELATIONSHIPID;
        end

        close QUERYVIEWRELATIONSHIPCURSOR;
        deallocate QUERYVIEWRELATIONSHIPCURSOR;


        /****************************************************************************************************************************/
        /* Check for and update any "upgraded" list segments that point at the same SEGMENTLISTID in the MKTESEGMENTLISTDATA table. */
        /****************************************************************************************************************************/
        --Check for other list segments that may point at the same records in MKTSEGMENTLISTDATA as the one we are trying to delete.

        --All this work only needs to be done if the user deletes the list segment whose ID is used in MKTSEGMENTLISTDATA.  If one

        --of the other "upgrade" list segment's ID does not exist in the MKTSEGMENTLISTDATA table, then we can just run through our

        --normal delete process.  This is only here so we don't delete the actual imported list data until there is only one list

        --segment left in the system that points at the set of records in MKTSEGMENTLISTDATA.

        declare @UPGRADEVIEWS table([NEWSEGMENTLISTID] uniqueidentifier, [VIEWDEFINITION] nvarchar(max));
        declare @NEWSEGMENTLISTID uniqueidentifier;
        declare @VIEWDEFINITION nvarchar(max);

        insert into @UPGRADEVIEWS ([NEWSEGMENTLISTID], [VIEWDEFINITION])
          select
            cast(replace(substring([O].[NAME], len('V_MKTSEGMENTLIST_') + 1, 36), '_', '-') as uniqueidentifier) as [SEGMENTLISTID],
            [M].[DEFINITION]
          from sys.all_sql_modules as [M]
          inner join sys.objects as [O] on [M].[OBJECT_ID] = [O].[OBJECT_ID]
          where ([O].[NAME] like 'V\_MKTSEGMENTLIST\_[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]\_[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]\_[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]\_[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]\_[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]' escape '\'
          or [O].[NAME] like 'V\_MKTSEGMENTLIST\_[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]\_[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]\_[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]\_[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]\_[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]\_DUPLICATE' escape '\')
          and [O].[NAME] <> ('V_MKTSEGMENTLIST_' + replace(cast(@SEGMENTLISTID as nvarchar(36)), '-', '_'))
          and [O].[NAME] <> ('V_MKTSEGMENTLIST_' + replace(cast(@SEGMENTLISTID as nvarchar(36)), '-', '_') + '_DUPLICATE')
          and [M].[DEFINITION] like '/*##LIST UPGRADE##%'
          and [M].[DEFINITION] like '%\[SEGMENTLISTID\] = ''' + cast(@SEGMENTLISTID as nvarchar(36)) + '''%' escape '\';

        select top 1
          @NEWSEGMENTLISTID = [NEWSEGMENTLISTID]
        from @UPGRADEVIEWS;

        if @NEWSEGMENTLISTID is not null
          begin
            --Update the MKTSEGMENTLISTDATA table to point at a different SEGMENTLISTID...
            update dbo.[MKTSEGMENTLISTDATA] set
              [SEGMENTLISTID] = @NEWSEGMENTLISTID
            where [SEGMENTLISTID] = @SEGMENTLISTID;

            --Update the remaining "upgrade" views to point at the new SEGMENTLISTID...
            declare VIEWCURSOR cursor local fast_forward for
              select [VIEWDEFINITION]
              from @UPGRADEVIEWS;

            open VIEWCURSOR;
            fetch next from VIEWCURSOR into @VIEWDEFINITION;

            while (@@FETCH_STATUS = 0)
            begin
              set @VIEWDEFINITION = replace(@VIEWDEFINITION, 'create view', 'alter view');
              set @VIEWDEFINITION = replace(@VIEWDEFINITION, '[SEGMENTLISTID] = ''' + cast(@SEGMENTLISTID as nvarchar(36)) + '''', '[SEGMENTLISTID] = ''' + cast(@NEWSEGMENTLISTID as nvarchar(36)) + '''');
              exec (@VIEWDEFINITION);

              fetch next from VIEWCURSOR into @VIEWDEFINITION;
            end

            close VIEWCURSOR;
            deallocate VIEWCURSOR;
          end
      end


    /*************************/
    /* Delete the ID sets... */
    /*************************/
    exec dbo.[USP_MKTSEGMENTLIST_DELETEIDSETS] @SEGMENTLISTID, @STANDARDIDSETID, @DUPLICATEIDSETID, null, @CHANGEAGENTID;


    if @DELETINGSEGMENT = 1
      begin
        /************************************************************************************/
        /* Delete all the query view catalog items for all finder files for this segment... */
        /************************************************************************************/
        --Clear the QUERYVIEWCATALOGIDs for all the finder files for this segment...

        update dbo.[MKTSEGMENTLIST] set
          [QUERYVIEWCATALOGID] = null,
          [CHANGEDBYID] = @CHANGEAGENTID,
          [DATECHANGED] = getdate()
        where [SEGMENTID] = @SEGMENTID;

        --Delete the records from the query view catalog and drop the underlying views...

        declare @VIEWNAMEFORQUERY nvarchar(128);
        declare QUERYVIEWCURSOR cursor local fast_forward for
          select [QV].[ID], [QUERYVIEWCATALOG].[OBJECTNAME]
          from @QUERYVIEWS as [QV]
          inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [QV].[ID];

        open QUERYVIEWCURSOR;
        fetch next from QUERYVIEWCURSOR into @QUERYVIEWCATALOGID, @VIEWNAMEFORQUERY;

        while (@@FETCH_STATUS = 0)
        begin
          --Delete the query view catalog record...

          exec dbo.[USP_QUERYVIEWCATALOG_DELETEBYID_WITHCHANGEAGENTID] @QUERYVIEWCATALOGID, @CHANGEAGENTID;

          --Drop the query view for each finder file...

          if exists(select 1 from INFORMATION_SCHEMA.VIEWS where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @VIEWNAMEFORQUERY)
            exec ('drop view dbo.[' + @VIEWNAMEFORQUERY + ']');

          fetch next from QUERYVIEWCURSOR into @QUERYVIEWCATALOGID, @VIEWNAMEFORQUERY;
        end

        close QUERYVIEWCURSOR;
        deallocate QUERYVIEWCURSOR;


        /*******************************************************************************/
        /* Cleanup the LoadSpecLog table so it doesn't get cluttered with artifacts... */
        /*******************************************************************************/
        declare @LOADSPECLOGID uniqueidentifier;
        declare LOADSPECLOGCURSOR cursor local fast_forward for
          select [ID]
          from dbo.[LOADSPECLOG]
          where [SPECID] in (select [ID] from @QUERYVIEWS);

        open LOADSPECLOGCURSOR;
        fetch next from LOADSPECLOGCURSOR into @LOADSPECLOGID;

        while (@@FETCH_STATUS = 0)
        begin
          exec dbo.[USP_LOADSPECLOG_DELETEBYID_WITHCHANGEAGENTID] @LOADSPECLOGID, @CHANGEAGENTID;
          fetch next from LOADSPECLOGCURSOR into @LOADSPECLOGID;
        end

        close LOADSPECLOGCURSOR;
        deallocate LOADSPECLOGCURSOR;


        /********************************************************/
        /* Delete all the IDSet recordtypes for this segment... */
        /********************************************************/
        declare RECORDTYPECURSOR cursor local fast_forward for
          select distinct [RECORDTYPEID]
          from @QUERYVIEWS;

        open RECORDTYPECURSOR;
        fetch next from RECORDTYPECURSOR into @IDSETRECORDTYPEID;

        while (@@FETCH_STATUS = 0)
        begin
          exec dbo.[USP_RECORDTYPE_DELETEBYID_WITHCHANGEAGENTID] @IDSETRECORDTYPEID, @CHANGEAGENTID;
          fetch next from RECORDTYPECURSOR into @IDSETRECORDTYPEID;
        end

        close RECORDTYPECURSOR;
        deallocate RECORDTYPECURSOR;


        /***********************************************************************/
        /* Delete all this segment's imported data for all its finder files... */
        /***********************************************************************/
        declare @SQL nvarchar(max);

        --Delete all the records in the matchback gift donors table.  Since the user cannot change the record source on a list,

        --we only have to worry about deleting from one record source matchback table here.

        set @SQL = 'delete from dbo.[MKTSEGMENTLISTDATADONORS_' + replace(cast(@RECORDSOURCEID as nvarchar(36)), '-', '_') + ']' + char(13) +
                   'where [ID] in (select [ID] from dbo.[MKTSEGMENTLISTDATA] where [SEGMENTLISTID] in (select [ID] from dbo.[MKTSEGMENTLIST] where [SEGMENTID] = @SEGMENTID))';
        exec sp_executesql @SQL, N'@SEGMENTID uniqueidentifier', @SEGMENTID = @SEGMENTID;

        --Delete all the imported records for this segment, Imported, Historical, Purged, .... , everything...

        delete from dbo.[MKTSEGMENTLISTDATA]
        where [SEGMENTLISTID] in (select [ID] from dbo.[MKTSEGMENTLIST] where [SEGMENTID] = @SEGMENTID);


        /****************************************************/
        /* Delete all this segment's finder file records... */
        /****************************************************/
        --Update the segment and clear the current finder file reference so we don't get foreign key errors when we delete the finder files below...

        update dbo.[MKTSEGMENT] set
          [CURRENTSEGMENTLISTID] = null,
          [CHANGEDBYID] = @CHANGEAGENTID,
          [DATECHANGED] = getdate()
        where [ID] = @SEGMENTID;

        --Delete all the list segment finder files for this segment...

        declare SEGMENTLISTCURSOR cursor local fast_forward for
          select [ID], dbo.[UFN_MKTSEGMENTLIST_MAKEVIEWNAME_FORQUERY]([ID])
          from dbo.[MKTSEGMENTLIST]
          where [SEGMENTID] = @SEGMENTID;

        open SEGMENTLISTCURSOR;
        fetch next from SEGMENTLISTCURSOR into @SEGMENTLISTID, @VIEWNAMEFORQUERY;

        while (@@FETCH_STATUS = 0)
        begin
          exec dbo.[USP_MKTSEGMENTLIST_DELETEBYID_WITHCHANGEAGENTID] @SEGMENTLISTID, @CHANGEAGENTID;
     fetch next from SEGMENTLISTCURSOR into @SEGMENTLISTID, @VIEWNAMEFORQUERY;
        end

        close SEGMENTLISTCURSOR;
        deallocate SEGMENTLISTCURSOR;
      end
  end try

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

  return 0;