USP_MKTSEGMENTATIONACTIVATE_CACHECONSTITUENTSEGMENTS

Saves the activated marketing effort's constituent and segment relationships.

Parameters

Parameter Parameter Type Mode Description
@SEGMENTATIONID uniqueidentifier IN
@SEGMENTATIONEXCLUSIONID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.[USP_MKTSEGMENTATIONACTIVATE_CACHECONSTITUENTSEGMENTS]
(
  @SEGMENTATIONID uniqueidentifier,
  @SEGMENTATIONEXCLUSIONID uniqueidentifier = null
)
as
  set nocount on;

  declare @ACTIVE bit;
  declare @SEGMENTATIONISHISTORICAL bit;
  declare @RECORDSOURCEID uniqueidentifier;
  declare @RECORDTYPEID uniqueidentifier;
  declare @CONSTITUENTSEGMENTTABLE nvarchar(128);
  declare @SEGMENTID uniqueidentifier;
  declare @TESTSEGMENTID uniqueidentifier;
  declare @DATATABLE nvarchar(255);
  declare @SQL nvarchar(max);
  declare @MARKETINGRECORDTYPE tinyint;  /* 1=Record Source, 2=List/Duplicate List, 3=Consolidated List */
  declare @LISTID uniqueidentifier;
  declare @ISVENDORMANAGED bit;
  declare @DONORQUERYVIEWCATALOGID uniqueidentifier;
  declare @SOURCECODEMAPID uniqueidentifier;
  declare @LISTIDSQL nvarchar(128);
  declare @WHERESQL nvarchar(max);
  declare @MAILINGTYPECODE tinyint;
  declare @LISTMATCHBACKTABLE nvarchar(128);
  declare @FINDERFILEWITHSQL nvarchar(max) = '';
  declare @FINDERFILETABLENAME nvarchar(128) = dbo.[UFN_MKTFINDERFILE_BUILDTABLENAME](@SEGMENTATIONID);
  declare @FINDERFILETABLEEXISTS bit = (case when object_id(@FINDERFILETABLENAME, 'U') is not null then 1 else 0 end);
  declare @ISBBEC bit = (case when dbo.[UFN_INSTALLEDPRODUCTS_PRODUCTIS]('BB9873D7-F1ED-430A-8AB4-F09F47056538') = 0 then 1 else 0 end);

  declare @FINDERTABLEROWS bigint;
  declare @DISCTINCTFINDERNUMBERS bigint;
  declare @SINGLEFINDERFILE bit = 0;

  if @FINDERFILETABLEEXISTS = 1 and @ISBBEC = 1
    begin
      -- BTR 8/13/2013 WI 302204 -- this only applies to BBEC, since only BBEC uses the CONSTITUENTSEGMENT_<GUID> table to shortcut finder number lookups

      -- (it doesn't work in DM/RE because RE constituent IDs are integers, and thus you can't join <finder file table>.[ID] to <segmentation data>.[DONORID])


      --MDC 2013-05-22 - WI274032 - For an effort that has an imported finder file, we need to grab the finder number if the constituent is in the finder file

      --If they import multiple finder files and import the same FINDERNUMBER multiple times with different names, segments, or sourcecodes,

      --then we need to make sure we only grab info for the findernumber from the latest import file.

      --using the row_number() is same method used in USP_DATALIST_MKTFINDERNUMBERLOOKUP to determine the latest finder number


      --For performance reasons, check if the finder numbers are distinct

      set @SQL = 'select @FINDERTABLEROWS = count(1) from dbo.[' + @FINDERFILETABLENAME + '];'
      exec sp_executesql @SQL, N'@FINDERTABLEROWS bigint output', @FINDERTABLEROWS = @FINDERTABLEROWS output;

      set @SQL = 'select @DISCTINCTFINDERNUMBERS = count(distinct [FINDERNUMBER]) from dbo.[' + @FINDERFILETABLENAME + '];'
      exec sp_executesql @SQL, N'@DISCTINCTFINDERNUMBERS bigint output', @DISCTINCTFINDERNUMBERS = @DISCTINCTFINDERNUMBERS output;

      if @FINDERTABLEROWS <> @DISCTINCTFINDERNUMBERS
      begin
      --create a temp table to hold the ranked finder numbers so we only have to do this once

        if object_id ('tempdb.dbo.#RANKEDFINDERNUMBERS') is not null
          drop table #RANKEDFINDERNUMBERS;

        create table #RANKEDFINDERNUMBERS ([ID] uniqueidentifier not null, [FINDERNUMBER] bigint);

        set @FINDERFILEWITHSQL = 
          'with [FINDERNUMBERSINORDER] ([ID], [RANK], [FINDERNUMBER]) as (' + char(13) +
          '  select' + char(13) +
          '    [FT].[ID],' + char(13) +
          '    row_number() over (partition by [FT].[FINDERNUMBER] order by [MKTFINDERFILEIMPORTPROCESS].[DATEADDED] desc) as [RANK],' + char(13) +
          '    [FT].[FINDERNUMBER]' + char(13) +
          '  from dbo.[' + @FINDERFILETABLENAME + '] as [FT] with (index([IX_' + @FINDERFILETABLENAME + '_FINDERNUMBER]))' + char(13) +
          '  inner join dbo.[MKTFINDERFILEIMPORTPROCESS] on [MKTFINDERFILEIMPORTPROCESS].[ID] = [FT].[FINDERFILEID]' + char(13) +
          ')'+ char(13) +
          'insert #RANKEDFINDERNUMBERS ([ID], [FINDERNUMBER])' + char(13) +
          '  select' + char(13) +
          '    [ID],' + char(13) +
          '    [FINDERNUMBER]' + char(13) +
          '  from [FINDERNUMBERSINORDER]' + char(13) +
          '  where [FINDERNUMBERSINORDER].[RANK] = 1;' + char(13);

        exec sp_executesql @FINDERFILEWITHSQL;

        --add index

        alter table #RANKEDFINDERNUMBERS add constraint [PK_RANKEDFINDERNUMBERS_ID] primary key ([ID]);

      end
      else
        set @SINGLEFINDERFILE = 1;

    end

  select
    @MAILINGTYPECODE = [MAILINGTYPECODE],
    @ACTIVE = [ACTIVE],
    @SEGMENTATIONISHISTORICAL = [ISHISTORICAL],
    @DATATABLE = (case when @SEGMENTATIONEXCLUSIONID is null then dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME]([ID]) else dbo.[UFN_MKTSEGMENTATIONACTIVATEEXCLUSION_MAKETABLENAME]([ID]) end)
  from dbo.[MKTSEGMENTATION]
  where [ID] = @SEGMENTATIONID;

  if @SEGMENTATIONISHISTORICAL = 0
    begin
      /* Loop through each record source in this mailing because we have a separate CONSTITUENTSEGMENT table for each record source */
      declare RECORDSOURCECURSOR cursor local fast_forward for
        select [DRS].[QUERYVIEWCATALOGID], (case @MAILINGTYPECODE when 1 then [GQV].[RECORDTYPEID] when 2 then [MQV].[RECORDTYPEID] when 3 then [SQV].[RECORDTYPEID] when 5 then [GQV].[RECORDTYPEID] else [CQV].[RECORDTYPEID] end)
        from dbo.[UFN_MKTSEGMENTATION_GETDISTINCTRECORDSOURCES](@SEGMENTATIONID) as [DRS]
        inner join dbo.[QUERYVIEWCATALOG] as [CQV] on [CQV].[ID] = [DRS].[QUERYVIEWCATALOGID]
        inner join dbo.[MKTGIFTRECORDSOURCE] on [MKTGIFTRECORDSOURCE].[ID] = [DRS].[QUERYVIEWCATALOGID]
        left outer join dbo.[MKTMEMBERSHIPRECORDSOURCE] on [MKTMEMBERSHIPRECORDSOURCE].[ID] = [DRS].[QUERYVIEWCATALOGID]
        left outer join dbo.[MKTSPONSORSHIPRECORDSOURCE] on [MKTSPONSORSHIPRECORDSOURCE].[ID] = [DRS].[QUERYVIEWCATALOGID]
        inner join dbo.[QUERYVIEWCATALOG] as [GQV] on [GQV].[ID] = [MKTGIFTRECORDSOURCE].[QUERYVIEWCATALOGID]
        left outer join dbo.[QUERYVIEWCATALOG] as [MQV] on [MQV].[ID] = [MKTMEMBERSHIPRECORDSOURCE].[QUERYVIEWCATALOGID]
        left outer join dbo.[QUERYVIEWCATALOG] as [SQV] on [SQV].[ID] = [MKTSPONSORSHIPRECORDSOURCE].[QUERYVIEWCATALOGID];

      open RECORDSOURCECURSOR;
      fetch next from RECORDSOURCECURSOR into @RECORDSOURCEID, @RECORDTYPEID;

      while (@@FETCH_STATUS = 0)
        begin
          /* Get the CONSTITUENTSEGMENT table name */
          set @CONSTITUENTSEGMENTTABLE = dbo.[UFN_CONSTITUENTSEGMENT_MAKETABLENAME](@RECORDSOURCEID);
          set @LISTMATCHBACKTABLE = dbo.[UFN_MKTRECORDSOURCE_MAKEMATCHBACKTABLENAME](@RECORDSOURCEID);

          if @SEGMENTATIONEXCLUSIONID is null
            begin
              if @ACTIVE = 1
                begin
                  /* Only remove the existing constituent IDs for this mailing where the segment uses a list or consolidated list. */
                  /* We do this so we don't have to delete and re-insert the same house file constit IDs every time, since the constit */
                  /* IDs will not change except for lists because we run matchback. */
                  set @SQL = 'delete from dbo.[' + @CONSTITUENTSEGMENTTABLE + ']' + char(13) +
                             'where [SEGMENTID] in (' + 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.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENT].[IDSETREGISTERID]' + char(13) +
                             '  where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID' + char(13) +
                             '  and [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 0' + char(13) +
                             '  and ([MKTSEGMENT].[SEGMENTTYPECODE] = 2 or [IDSETREGISTER].[RECORDTYPEID] <> @RECORDTYPEID))';

                  exec sp_executesql @SQL, N'@SEGMENTATIONID uniqueidentifier, @RECORDTYPEID uniqueidentifier', @SEGMENTATIONID = @SEGMENTATIONID, @RECORDTYPEID = @RECORDTYPEID;
                end
              else
                begin
                  /* Remove all the existing constituent IDs for this mailing... */
                  set @SQL = 'delete from dbo.[' + @CONSTITUENTSEGMENTTABLE + ']' + char(13) +
                             'where [SEGMENTID] in (select [ID] from dbo.[MKTSEGMENTATIONSEGMENT] where [SEGMENTATIONID] = @SEGMENTATIONID and [EXCLUDE] = 0)';

                  exec sp_executesql @SQL, N'@SEGMENTATIONID uniqueidentifier', @SEGMENTATIONID = @SEGMENTATIONID;
                end
            end

          /* Loop through each segment and test segment in the mailing for this record source and insert the */
          /* constituent IDs into the CONSTITUENTSEGMENT table.  Only grab the segments that use this record source. */
          if @SEGMENTATIONEXCLUSIONID is null
            declare SEGMENTCURSOR cursor local fast_forward for
              select [MKTSEGMENTATIONSEGMENT].[ID], null
              from dbo.[MKTSEGMENTATIONSEGMENT]
              inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
              left join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENT].[IDSETREGISTERID]
              where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
              and [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 0
              and [MKTSEGMENT].[QUERYVIEWCATALOGID] = @RECORDSOURCEID
              and (@ACTIVE = 0 or (@ACTIVE = 1 and ([MKTSEGMENT].[SEGMENTTYPECODE] = 2 or [IDSETREGISTER].[RECORDTYPEID] <> @RECORDTYPEID)))
              union all
              select[MKTSEGMENTATIONSEGMENT].[ID], [MKTSEGMENTATIONTESTSEGMENT].[ID]
              from dbo.[MKTSEGMENTATIONSEGMENT]
              inner join dbo.[MKTSEGMENTATIONTESTSEGMENT] on [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID] = [MKTSEGMENTATIONSEGMENT].[ID]
              inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
              left join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENT].[IDSETREGISTERID]
              where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
              and [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 0
              and [MKTSEGMENT].[QUERYVIEWCATALOGID] = @RECORDSOURCEID
              and (@ACTIVE = 0 or (@ACTIVE = 1 and ([MKTSEGMENT].[SEGMENTTYPECODE] = 2 or [IDSETREGISTER].[RECORDTYPEID] <> @RECORDTYPEID)));
          else
            begin
              declare @SEGMENTTABLE table ([SEGMENTID] uniqueidentifier, [TESTSEGMENTID] uniqueidentifier);

              set @SQL = 'select distinct [SEGMENTID], [TESTSEGMENTID]' + char(13) +
                         'from dbo.[' + @DATATABLE + ']' + char(13) +
                         'where [SEGMENTATIONEXCLUSIONID] = @SEGMENTATIONEXCLUSIONID';

              insert into @SEGMENTTABLE
                exec sp_executesql @SQL, N'@SEGMENTATIONEXCLUSIONID uniqueidentifier', @SEGMENTATIONEXCLUSIONID = @SEGMENTATIONEXCLUSIONID;

              declare SEGMENTCURSOR cursor local fast_forward for
                select [S].[SEGMENTID], [S].[TESTSEGMENTID]
                from @SEGMENTTABLE as [S]
                inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [S].[SEGMENTID]
                where [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 0;
            end

          open SEGMENTCURSOR;
          fetch next from SEGMENTCURSOR into @SEGMENTID, @TESTSEGMENTID;

          while (@@FETCH_STATUS = 0)
            begin

              if @TESTSEGMENTID is null
                begin
                  -- Segment

                  select
                    @SOURCECODEMAPID = [MKTSOURCECODEMAP].[ID]
                  from dbo.[MKTSOURCECODEMAP]
                  where [SEGMENTATIONSEGMENTID] = @SEGMENTID and [SEGMENTATIONTESTSEGMENTID] is null;
                end
              else
                begin
                  -- Test segment

                  select
                    @SOURCECODEMAPID = [MKTSOURCECODEMAP].[ID]
                  from dbo.[MKTSOURCECODEMAP]
                  where [SEGMENTATIONSEGMENTID] = @SEGMENTID and [SEGMENTATIONTESTSEGMENTID] = @TESTSEGMENTID;
                end

              /* Gather some info so we can build the SQL */
              select distinct
                @LISTID = [MKTSEGMENTLIST].[LISTID],
                @ISVENDORMANAGED = dbo.[UFN_MKTSEGMENT_ISVENDORMANAGEDLIST]([MKTSEGMENT].[ID]),
                @MARKETINGRECORDTYPE = dbo.[UFN_MKTSEGMENT_GETMARKETINGRECORDTYPE]([MKTSEGMENT].[ID]),
                @DONORQUERYVIEWCATALOGID = (case when dbo.[UFN_MKTSEGMENT_GETMARKETINGRECORDTYPE]([MKTSEGMENT].[ID]) = 2 then [MKTSEGMENTLIST].[QUERYVIEWCATALOGID] else @RECORDSOURCEID end)
              from dbo.[MKTSEGMENTATIONSEGMENT]
              inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
              left join dbo.[MKTSEGMENTATIONSEGMENTLIST] on [MKTSEGMENTATIONSEGMENTLIST].[ID] = [MKTSEGMENTATIONSEGMENT].[ID]
              left join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENTATIONSEGMENTLIST].[SEGMENTLISTID]
              left join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENT].[IDSETREGISTERID]
              inner join dbo.[MKTSEGMENTATIONACTIVATE] on [MKTSEGMENTATIONACTIVATE].[SEGMENTATIONID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] and [MKTSEGMENTATIONACTIVATE].[RECORDSOURCEID] = [MKTSEGMENT].[QUERYVIEWCATALOGID]
              inner join dbo.[MKTRECORDSOURCE] on [MKTRECORDSOURCE].[ID] = [MKTSEGMENT].[QUERYVIEWCATALOGID]
              left join dbo.[MKTSOURCECODEMAP] on [MKTSOURCECODEMAP].[SEGMENTATIONSEGMENTID] = [MKTSEGMENTATIONSEGMENT].[ID] and [MKTSOURCECODEMAP].[SEGMENTATIONTESTSEGMENTID] is null
              where [MKTSEGMENTATIONSEGMENT].[ID] = @SEGMENTID
              and dbo.[UFN_MKTRECORDSOURCE_VALIDFORPRODUCT]([MKTRECORDSOURCE].[ID]) = 1
              and (([MKTSEGMENTLIST].[LISTID] is not null and [MKTSOURCECODEMAP].[ID] is null) or ([MKTSEGMENTLIST].[LISTID] is null and [MKTSOURCECODEMAP].[LISTID] is null) or ([MKTSOURCECODEMAP].[LISTID] = (case when dbo.[UFN_MKTSEGMENT_GETMARKETINGRECORDTYPE]([MKTSEGMENT].[ID]) = 2 then [MKTSEGMENTLIST].[LISTID] else @RECORDSOURCEID end)));

              set @SQL = 'insert into dbo.[' + @CONSTITUENTSEGMENTTABLE +'] ([CONSTITUENTID], [SEGMENTID], [TESTSEGMENTID], [SOURCECODEMAPID], [FINDERNUMBER])' + char(13);

              if @MARKETINGRECORDTYPE = 2 or @MARKETINGRECORDTYPE = 3  --List/Duplicate List or Consolidated List

                /* See if we need to cast the person ID from the list matchback table(s) in the list joins... */
                select @LISTIDSQL = (case when [DATA_TYPE] = 'uniqueidentifier' then '[LISTDONORS].[ID]' else 'cast(isnull([LISTDONORS].[ID],'''') as varchar(36))' end)
                from [INFORMATION_SCHEMA].[COLUMNS]
                where [TABLE_SCHEMA] = 'dbo'
                and [TABLE_NAME] = @DATATABLE
                and [COLUMN_NAME] = 'DONORID';

              if @MARKETINGRECORDTYPE = 1 or @MARKETINGRECORDTYPE = 2  --Record Source or List/Duplicate List

                begin
                  if @MARKETINGRECORDTYPE = 1  --Record Source

                    /* Select directly from the activated data table */
                    set @SQL += '  select distinct [DONORS].[DONORID], @SEGMENTID, @TESTSEGMENTID, @SOURCECODEMAPID, [DONORS].[FINDERNUMBER]' + char(13) +
                 '  from dbo.[' + @DATATABLE + '] as [DONORS]' + char(13);
                  else  --List/Duplicate List

                    begin
                      /* Join to the matchback table for this list. */
                      set @SQL += '  select distinct [LISTDONORS].[DONORID], @SEGMENTID, @TESTSEGMENTID, @SOURCECODEMAPID, ';
                      if @FINDERFILETABLEEXISTS = 1 and @ISBBEC = 1
                        set @SQL += 'isnull([MOSTRECENTFINDERNUMBER].[FINDERNUMBER], (case when [DONORS].[FINDERNUMBER] > 0 then [DONORS].[FINDERNUMBER] else 0 end))' + char(13);
                      else
                        set @SQL += '(case when [DONORS].[FINDERNUMBER] > 0 then [DONORS].[FINDERNUMBER] else 0 end)' + char(13);

                      set @SQL += '  from dbo.[' + @DATATABLE + '] as [DONORS]' + char(13) +
                                  '  inner join dbo.[' + @LISTMATCHBACKTABLE + '] as [LISTDONORS] on ' + @LISTIDSQL + ' = [DONORS].[DONORID] and [LISTDONORS].[SEGMENTATIONID] = @SEGMENTATIONID' + char(13);
                    end

                  if @SEGMENTATIONEXCLUSIONID is not null
                    set @SQL += '  left join dbo.[' + dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME](@SEGMENTATIONID) + '] as [DATA] on [DONORS].[FINDERNUMBER] = [DATA].[FINDERNUMBER]';

                  if @FINDERFILETABLEEXISTS = 1 and @ISBBEC = 1
                  begin
                    if @SINGLEFINDERFILE = 0
                      set @SQL += '  left join #RANKEDFINDERNUMBERS as [MOSTRECENTFINDERNUMBER] on [LISTDONORS].[DONORID] = [MOSTRECENTFINDERNUMBER].[ID]' + char(13);
                    else
                      set @SQL += '  left join dbo.[' + @FINDERFILETABLENAME +'] as [MOSTRECENTFINDERNUMBER] with (index([IX_' + @FINDERFILETABLENAME + '_FINDERNUMBER])) on [LISTDONORS].[DONORID] = [MOSTRECENTFINDERNUMBER].[ID]' + char(13);
                  end

                  set @SQL += '  where [DONORS].[SEGMENTID] = @SEGMENTID' + char(13) +
                              '  and [DONORS].[TESTSEGMENTID] ' + (case when @TESTSEGMENTID is null then 'is null' else '= @TESTSEGMENTID' end) + char(13) +
                              '  and [DONORS].[DONORQUERYVIEWCATALOGID] ' + (case when @ISVENDORMANAGED = 1 or @DONORQUERYVIEWCATALOGID is null then 'is null' else '= @DONORQUERYVIEWCATALOGID' end) + char(13) +
                              (case when @SEGMENTATIONEXCLUSIONID is null then '' else '  and [DONORS].[SEGMENTATIONEXCLUSIONID] = @SEGMENTATIONEXCLUSIONID and [DATA].[FINDERNUMBER] is null' end);
                end
              else
                begin  --Consolidated List

                  set @WHERESQL = '  where [DONORS].[SEGMENTID] = @SEGMENTID' + char(13) +
                                  '  and [DONORS].[TESTSEGMENTID] ' + (case when @TESTSEGMENTID is null then 'is null' else '= @TESTSEGMENTID' end) +
                                  (case when @SEGMENTATIONEXCLUSIONID is null then '' else char(13) + '  and [DONORS].[SEGMENTATIONEXCLUSIONID] = @SEGMENTATIONEXCLUSIONID and [DATA].[FINDERNUMBER] is null' end);

                  /* Select the counts from the list matchback table first, then union to the counts from the record source.         */
                  /* Performing these as separate 'select' statements and unioning them together increases performance dramatically. */
                  set @SQL = 'with [LISTDONORS]([ID], [DONORID], [DONORQUERYVIEWCATALOGID], [SOURCECODEMAPID]) as (' + char(13) +
                             '  select distinct' + char(13) +
                             '    [LISTMATCHBACK].[ID],' + char(13) +
                             '    [LISTMATCHBACK].[DONORID],' + char(13) + 
                             '    [MKTSEGMENTLIST].[QUERYVIEWCATALOGID] as [DONORQUERYVIEWCATALOGID],' + char(13) +
                             '    (select [MKTSOURCECODEMAP].[ID]' + char(13) +
                             '     from dbo.[MKTSOURCECODEMAP]' + char(13) +
                             '     where [MKTSOURCECODEMAP].[SEGMENTATIONSEGMENTID] = @SEGMENTID' + char(13) +
                             '     and ((@TESTSEGMENTID is null and [MKTSOURCECODEMAP].[SEGMENTATIONTESTSEGMENTID] is null) or ([MKTSOURCECODEMAP].[SEGMENTATIONTESTSEGMENTID] = @TESTSEGMENTID))' + char(13) +
                             '     and [MKTSOURCECODEMAP].[LISTID] = [MKTSEGMENTLIST].[LISTID]) as [SOURCECODEMAPID]' + char(13) +
                             '  from dbo.[' + @LISTMATCHBACKTABLE + '] as [LISTMATCHBACK]' + char(13) +
                             '  inner join dbo.[MKTSEGMENTLISTDATA] on [MKTSEGMENTLISTDATA].[ID] = [LISTMATCHBACK].[ID]' + char(13) +
                             '  inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENTLISTDATA].[SEGMENTLISTID]' + char(13) +
                             '  where [LISTMATCHBACK].[SEGMENTATIONID] = @SEGMENTATIONID' + char(13) +
                             ')' + char(13) +
                             @SQL +
                             '  select distinct [LISTDONORS].[DONORID], @SEGMENTID, @TESTSEGMENTID, [LISTDONORS].[SOURCECODEMAPID], (case when [DONORS].[FINDERNUMBER] > 0 then [DONORS].[FINDERNUMBER] else 0 end)' + char(13) +
                             '  from dbo.[' + @DATATABLE + '] as [DONORS]' + char(13) +
                             '  inner join [LISTDONORS] on ' + @LISTIDSQL + ' = [DONORS].[DONORID]' + char(13);

                  if @SEGMENTATIONEXCLUSIONID is not null
                    set @SQL += '  left join dbo.[' + dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME](@SEGMENTATIONID) + '] as [DATA] on [DONORS].[FINDERNUMBER] = [DATA].[FINDERNUMBER]' + char(13);

                  set @SQL += @WHERESQL + char(13) +
                              '  and [DONORS].[DONORQUERYVIEWCATALOGID] in (select distinct [DONORQUERYVIEWCATALOGID] from [LISTDONORS])' + char(13) +
                              char(13) +
                              '  union all' + char(13) +
                              char(13) +
                              '  select distinct [DONORS].[DONORID], @SEGMENTID, @TESTSEGMENTID, @SOURCECODEMAPID, [DONORS].[FINDERNUMBER]' + char(13) +
                              '  from dbo.[' + @DATATABLE + '] as [DONORS]' + char(13);

                  if @SEGMENTATIONEXCLUSIONID is not null
                    set @SQL += '  left join dbo.[' + dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME](@SEGMENTATIONID) + '] as [DATA] on [DONORS].[FINDERNUMBER] = [DATA].[FINDERNUMBER]' + char(13);

                  set @SQL += @WHERESQL + char(13) +
                              '  and [DONORS].[DONORQUERYVIEWCATALOGID] = @DONORQUERYVIEWCATALOGID' + char(13) +
                              '  and (not exists(select * from [LISTDONORS]) or [DONORS].[DONORID] not in (select ' + @LISTIDSQL + ' from [LISTDONORS]))';
                end

              /* Insert the constituent, segment, test segment ID, and list source code part IDs into the CONSTITUENTSEGMENT table */
              exec sp_executesql @SQL, N'@SEGMENTATIONID uniqueidentifier, @SEGMENTID uniqueidentifier, @TESTSEGMENTID uniqueidentifier, @DONORQUERYVIEWCATALOGID uniqueidentifier, @SOURCECODEMAPID uniqueidentifier, @SEGMENTATIONEXCLUSIONID uniqueidentifier', @SEGMENTATIONID = @SEGMENTATIONID, @SEGMENTID = @SEGMENTID, @TESTSEGMENTID = @TESTSEGMENTID, @DONORQUERYVIEWCATALOGID = @DONORQUERYVIEWCATALOGID, @SOURCECODEMAPID = @SOURCECODEMAPID, @SEGMENTATIONEXCLUSIONID = @SEGMENTATIONEXCLUSIONID;

              fetch next from SEGMENTCURSOR into @SEGMENTID, @TESTSEGMENTID;
            end

          close SEGMENTCURSOR;
          deallocate SEGMENTCURSOR;

          fetch next from RECORDSOURCECURSOR into @RECORDSOURCEID, @RECORDTYPEID;
        end

      close RECORDSOURCECURSOR;
      deallocate RECORDSOURCECURSOR;
    end

    if object_id ('tempdb.dbo.#RANKEDFINDERNUMBERS') is not null
      drop table #RANKEDFINDERNUMBERS;

  return 0;