USP_MKTSEGMENTATION_GETALLSELECTIONS

Parameters

Parameter Parameter Type Mode Description
@SEGMENTATIONID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.[USP_MKTSEGMENTATION_GETALLSELECTIONS]
(
  @SEGMENTATIONID uniqueidentifier = null
)
as
  begin
    declare @SELECTIONS table ([SELECTIONID] uniqueidentifier, [PROCESSED] bit default 0);
    declare @SELECTIONID uniqueidentifier;
    declare @UNPROCESSEDCOUNT integer = -1;
    declare @SQL nvarchar(max);
    declare @XML xml;

    create table #SEGMENTEDHOUSEFILESEGMENTS ([ID] uniqueidentifier);

    set nocount on;

    -- this is a giant while loop because you can't call insert into [...] exec [SP] recursively


    while (@UNPROCESSEDCOUNT <> 0)
      begin
        if @UNPROCESSEDCOUNT < 0
          begin
            -- this is the first time through the loop, so get the selections that make up the marketing effort


            -- ignore segmented house file segments

            if dbo.[UFN_MKTCONSTITUENTFILEIMPORT_IMPORTTABLEEXISTS](@SEGMENTATIONID) = 1
              begin
                set @SQL = 'insert into ##SEGMENTEDHOUSEFILESEGMENTS select distinct [SEGMENTATIONSEGMENTID] from dbo.[' + dbo.[UFN_MKTCONSTITUENTFILEIMPORT_BUILDTABLENAME](@SEGMENTATIONID) + '];'

                exec (@SQL);
              end

            insert into @SELECTIONS ([SELECTIONID], [PROCESSED])
            select distinct
              [MKTSEGMENTSELECTION].[SELECTIONID],
              case when [IDSETREGISTERADHOCQUERY].[ADHOCQUERYID] is null then 1 else 0 end
            from dbo.[MKTSEGMENTATIONSEGMENT]
            inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
            left join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
            inner join dbo.[MKTSEGMENTSELECTION] on [MKTSEGMENTSELECTION].[SEGMENTID] = [MKTSEGMENT].[ID]
            inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENTSELECTION].[SELECTIONID]
            left outer join dbo.[IDSETREGISTERADHOCQUERY] on [IDSETREGISTERADHOCQUERY].[IDSETREGISTERID] = [IDSETREGISTER].[ID]
            left outer join dbo.[IDSETREGISTERSMARTQUERYINSTANCE] on [IDSETREGISTERSMARTQUERYINSTANCE].[IDSETREGISTERID] = [IDSETREGISTER].[ID]
            left outer join dbo.[IDSETREGISTERDYNAMICIDSET] on [IDSETREGISTERDYNAMICIDSET].[STATICIDSETREGISTERID] = [IDSETREGISTER].[ID]
            where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
            and ([MKTSEGMENT].[SEGMENTTYPECODE] <> 2 or [MKTSEGMENTLIST].[PARENTSEGMENTID] is not null)
            and not exists(select top 1 1
                    from dbo.[APPEALMAILING]
                    inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [APPEALMAILING].[MKTSEGMENTATIONSEGMENTID]
            where [MKTSEGMENTATIONSEGMENT].[SEGMENTID] = [MKTSEGMENT].[ID])
            and not exists(select top 1 1
                    from #SEGMENTEDHOUSEFILESEGMENTS
                    where #SEGMENTEDHOUSEFILESEGMENTS.[ID] = [MKTSEGMENTATIONSEGMENT].[ID])
            and [IDSETREGISTER].[STATIC] = 1
            and ([IDSETREGISTERADHOCQUERY].[ID] is not null or [IDSETREGISTERSMARTQUERYINSTANCE].[ID] is not null or [IDSETREGISTERDYNAMICIDSET].[ID] is not null)
            union
            select distinct
              [MKTSEGMENTATIONFILTERSELECTION].[SELECTIONID],
              case when [IDSETREGISTERADHOCQUERY].[ADHOCQUERYID] is null then 1 else 0 end
            from dbo.[MKTSEGMENTATIONFILTERSELECTION]
            inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENTATIONFILTERSELECTION].[SELECTIONID]
            left outer join dbo.[IDSETREGISTERADHOCQUERY] on [IDSETREGISTERADHOCQUERY].[IDSETREGISTERID] = [IDSETREGISTER].[ID]
            left outer join dbo.[IDSETREGISTERSMARTQUERYINSTANCE] on [IDSETREGISTERSMARTQUERYINSTANCE].[IDSETREGISTERID] = [IDSETREGISTER].[ID]
            left outer join dbo.[IDSETREGISTERDYNAMICIDSET] on [IDSETREGISTERDYNAMICIDSET].[STATICIDSETREGISTERID] = [IDSETREGISTER].[ID]
            where [MKTSEGMENTATIONFILTERSELECTION].[SEGMENTATIONID] = @SEGMENTATIONID
            and [IDSETREGISTER].[STATIC] = 1
            and ([IDSETREGISTERADHOCQUERY].[ID] is not null or [IDSETREGISTERSMARTQUERYINSTANCE].[ID] is not null or [IDSETREGISTERDYNAMICIDSET].[ID] is not null)
          end
        else
          begin
            -- this is not the first time through the loop, so count the selections used by any selections that haven't been counted yet


            declare SELECTIONSTOPROCESS cursor local fast_forward for
            select [SELECTIONID] from @SELECTIONS where [PROCESSED] = 0;

            open SELECTIONSTOPROCESS;
            fetch next from SELECTIONSTOPROCESS into @SELECTIONID;

            while (@@FETCH_STATUS = 0)
              begin
                select 
                  @XML = [ADHOCQUERY].[QUERYDEFINITIONXML]
                from dbo.[ADHOCQUERY]
                inner join dbo.[IDSETREGISTERADHOCQUERY] on [IDSETREGISTERADHOCQUERY].[ADHOCQUERYID] = [ADHOCQUERY].[ID]
                where [IDSETREGISTERADHOCQUERY].[IDSETREGISTERID] = @SELECTIONID;

                if @XML is not null
                  with xmlnamespaces('Blackbaud.AppFx.WebService.API.1' as api),
                  [CHILDSELECTIONS] ([SELECTIONID]) as (
                  select
                    T.c.value('(api:IDSetFieldInfo/api:ID)[1]', 'uniqueidentifier') as [SELECTIONID]
                  from @XML.nodes('/api:AdHocQuery/api:FilterFields/api:f') as T(c)
                  where T.c.value('@IsIDSetField', 'bit') = 1
                  union
                  select
                    T.c.value('(api:IDSetFieldInfo/api:ID)[1]', 'uniqueidentifier') as [SELECTIONID]
                  from @XML.nodes('/api:AdHocQuery/api:SelectFields/api:f') as T(c)
                  where T.c.value('@IsIDSetField', 'bit') = 1)
                  insert into @SELECTIONS ([SELECTIONID], [PROCESSED])
                  select
                    [CHILDSELECTIONS].[SELECTIONID],
                    case when [IDSETREGISTERADHOCQUERY].[ADHOCQUERYID] is null then 1 else 0 end
                  from [CHILDSELECTIONS]
                  left outer join @SELECTIONS as [SELECTIONSSOFAR] on [SELECTIONSSOFAR].[SELECTIONID] = [CHILDSELECTIONS].[SELECTIONID]
                  left outer join dbo.[IDSETREGISTERADHOCQUERY] on [IDSETREGISTERADHOCQUERY].[IDSETREGISTERID] = [CHILDSELECTIONS].[SELECTIONID]
                  where [SELECTIONSSOFAR].[SELECTIONID] is null;

                update @SELECTIONS set [PROCESSED] = 1 where [SELECTIONID] = @SELECTIONID;

                fetch next from SELECTIONSTOPROCESS into @SELECTIONID;
              end

              close SELECTIONSTOPROCESS;
              deallocate SELECTIONSTOPROCESS;
          end

        select @UNPROCESSEDCOUNT = count(*) from @SELECTIONS where [PROCESSED] = 0;
      end

    drop table #SEGMENTEDHOUSEFILESEGMENTS;

    select [IDSETREGISTER].[ID], [IDSETREGISTER].[NAME]
    from @SELECTIONS as [S]
    inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [S].[SELECTIONID]

    return 0;
  end