USP_MKTSEGMENTATION_CALCULATEEXCLUSIONS

Calculates the exclusions for a given marketing effort.

Parameters

Parameter Parameter Type Mode Description
@SEGMENTATIONID uniqueidentifier IN
@RECORDSOURCEID uniqueidentifier IN
@EXCLUDEDIDSTEMPTABLENAME nvarchar(128) IN
@EXCLUSIONDATATABLE nvarchar(128) IN
@EFFORTTYPECODE tinyint IN
@RECORDTYPEID uniqueidentifier IN
@ISBBEC bit IN
@HOUSEHOLDINGTYPECODE tinyint IN

Definition

Copy


CREATE procedure dbo.[USP_MKTSEGMENTATION_CALCULATEEXCLUSIONS]
(
  @SEGMENTATIONID uniqueidentifier,
  @RECORDSOURCEID uniqueidentifier,
  @EXCLUDEDIDSTEMPTABLENAME nvarchar(128),
  @EXCLUSIONDATATABLE nvarchar(128),
  @EFFORTTYPECODE tinyint,
  @RECORDTYPEID uniqueidentifier,
  @ISBBEC bit,
  @HOUSEHOLDINGTYPECODE tinyint
)
as
  set nocount on;

/*
  Exclusion type codes:
  1 = Universe
  2 = Exclusions
  3 = Contact Rules
  4 = Householding
  5 = Address Processing
  6 = Previous Segment
  7 = Remove Members
  8 = Inline Exclusions
*/

  declare @MARKETINGRECORDTYPE tinyint;
  declare @NEEDSDISTINCT bit = 0;
  declare @DATATABLE nvarchar(128) = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME](@SEGMENTATIONID);
  declare @TEMPUNIVERSETABLE nvarchar(128) = '#TEMP_UNIVERSE_' + replace(cast(@RECORDTYPEID as nvarchar(36)), '-', '_');
  declare @TEMPEXCLUSIONSTABLE nvarchar(128) = '#TEMP_EXCLUSIONS_' + replace(cast(@RECORDTYPEID as nvarchar(36)), '-', '_');
  declare @DONORTORECIPIENTCONVERSIONTABLENAME nvarchar(128);
  declare @DONORTORECIPIENTCONVERSIONDONORIDFIELDNAME nvarchar(128);
  declare @DONORTORECIPIENTCONVERSIONRECIPIENTIDFIELDNAME nvarchar(128);
  declare @DONORTORECIPIENTCONVERSIONEXTRAJOINCONDITION nvarchar(max);
  declare @INSERTSQL nvarchar(max) = 'insert into dbo.[' + @EXCLUSIONDATATABLE + '] ([DONORID], [DONORNAME], [EXCLUDEDFROMSEGMENT], [INCLUDEDINSEGMENT], [EXCLUSIONREASON], [EXCLUSIONTYPE], [EXCLUSIONTYPECODE])' + char(13);
  declare @SQL nvarchar(max);

  declare @DONORIDDATATYPE nvarchar(128);
  declare @DATATYPE nvarchar(128);
  declare @EXCLUSIONSTABLENAME nvarchar(128);
  declare @CASTBEGIN nvarchar(15) = '###CASTBEGIN###';
  declare @CASTEND nvarchar(13) = '###CASTEND###';
  declare @NEEDCAST bit;

  begin try
    /* Figure out the record source type of the current segment (ie - whether it is a root record source, list, or consolidated list) */
    if @EFFORTTYPECODE = 0 -- appeal

      begin
        select 
          @MARKETINGRECORDTYPE = 1
        from dbo.[MKTRECORDSOURCE]
        inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTRECORDSOURCE].[ID]
        left outer join dbo.[RECORDTYPECOMPATIBILITYMAP] on [RECORDTYPECOMPATIBILITYMAP].[RECORDTYPE1ID] = [QUERYVIEWCATALOG].[RECORDTYPEID]
        where ([QUERYVIEWCATALOG].[RECORDTYPEID] = @RECORDTYPEID or [RECORDTYPECOMPATIBILITYMAP].[RECORDTYPE2ID] = @RECORDTYPEID)
        and (not exists(select 1 from dbo.[INSTALLEDPRODUCTLIST]) or dbo.[UFN_MKTRECORDSOURCE_VALIDFORPRODUCT]([MKTRECORDSOURCE].[ID]) = 1);

        if @MARKETINGRECORDTYPE is null
          begin
            select
              @MARKETINGRECORDTYPE = 2
            from dbo.[MKTSEGMENTLIST]
            where [IDSETRECORDTYPEID] = @RECORDTYPEID;

            if @MARKETINGRECORDTYPE is null
              begin
                select
                  @MARKETINGRECORDTYPE = 3
                from [MKTCONSOLIDATEDQUERYVIEWSPEC]
                inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTCONSOLIDATEDQUERYVIEWSPEC].[CONSOLIDATEDQUERYVIEWCATALOGID]
                where [QUERYVIEWCATALOG].[RECORDTYPEID] = @RECORDTYPEID;

                if @MARKETINGRECORDTYPE is null
                  raiserror('Invalid record type specified.', 13, 1);
                else
                  raiserror('The consolidated list record type is not supported in this stored procedure.', 13, 1);
              end
          end
      end
    else if @EFFORTTYPECODE = 1 -- acknowledgement

      select
        @NEEDSDISTINCT = 1,  --needed because we join on DONORID and it could be in the set of records more than once

        @MARKETINGRECORDTYPE = 1,  -- no need to take lists or the consolidated list into account

        --if donor selections are used in the mailing's universe/exclusions, the following is used to turn them into revenue...

        @DONORTORECIPIENTCONVERSIONTABLENAME = (case when @ISBBEC = 1 then 'FINANCIALTRANSACTION' else [QUERYVIEWCATALOG].[OBJECTNAME] end),
        @DONORTORECIPIENTCONVERSIONDONORIDFIELDNAME = (case when @ISBBEC = 1 then 'CONSTITUENTID' else [MKTGIFTRECORDSOURCE].[DONORIDFIELD] end),
        @DONORTORECIPIENTCONVERSIONRECIPIENTIDFIELDNAME = (case when @ISBBEC = 1 then 'ID' else [QUERYVIEWCATALOG].[PRIMARYKEYFIELD] end),
        @DONORTORECIPIENTCONVERSIONEXTRAJOINCONDITION = (case when @ISBBEC = 1 then ' and [FINANCIALTRANSACTION].[DELETEDON] is null' else '' end)
      from dbo.[MKTGIFTRECORDSOURCE]
      inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTGIFTRECORDSOURCE].[QUERYVIEWCATALOGID]
      where [MKTGIFTRECORDSOURCE].[ID] = @RECORDSOURCEID;
    else if @EFFORTTYPECODE = 2 -- membership

      select
        @NEEDSDISTINCT = 1,  --needed because we join on DONORID and it could be in the set of records more than once

        @MARKETINGRECORDTYPE = 1,  -- no need to take lists or the consolidated list into account

        --if donor selections are used in the mailing's universe/exclusions, the following is used to turn them into memberships...

        @DONORTORECIPIENTCONVERSIONTABLENAME = (case when @ISBBEC = 1 then 'MEMBER' else [QUERYVIEWCATALOG].[OBJECTNAME] end),
        @DONORTORECIPIENTCONVERSIONDONORIDFIELDNAME = (case when @ISBBEC = 1 then 'CONSTITUENTID' else [MKTMEMBERSHIPRECORDSOURCE].[MEMBERIDFIELD] end),
        @DONORTORECIPIENTCONVERSIONRECIPIENTIDFIELDNAME = (case when @ISBBEC = 1 then 'MEMBERSHIPID' else [MKTMEMBERSHIPRECORDSOURCE].[MEMBERSHIPSYSTEMIDFIELD] end),
        @DONORTORECIPIENTCONVERSIONEXTRAJOINCONDITION = (case when @ISBBEC = 1 then ' and [MEMBER].[ISPRIMARY] = 1 and [MEMBER].[ISDROPPED] = 0' else '' end)
      from dbo.[MKTMEMBERSHIPRECORDSOURCE]
      inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTMEMBERSHIPRECORDSOURCE].[QUERYVIEWCATALOGID]
      where [MKTMEMBERSHIPRECORDSOURCE].[ID] = @RECORDSOURCEID;
    else if @EFFORTTYPECODE = 3 -- sponsorship

      select
        @NEEDSDISTINCT = 1,  --needed because we join on DONORID and it could be in the set of records more than once

        @MARKETINGRECORDTYPE = 1,  -- no need to take lists or the consolidated list into account

        --if donor selections are used in the mailing's universe/exclusions, the following is used to turn them into sponsorships...

        @DONORTORECIPIENTCONVERSIONTABLENAME = (case when @ISBBEC = 1 then 'SPONSORSHIP' else [QUERYVIEWCATALOG].[OBJECTNAME] end),
        @DONORTORECIPIENTCONVERSIONDONORIDFIELDNAME = (case when @ISBBEC = 1 then 'CONSTITUENTID' else [MKTSPONSORSHIPRECORDSOURCE].[SPONSORIDFIELD] end),
        @DONORTORECIPIENTCONVERSIONRECIPIENTIDFIELDNAME = (case when @ISBBEC = 1 then 'ID' else [MKTSPONSORSHIPRECORDSOURCE].[SPONSORSHIPSYSTEMIDFIELD] end)
      from dbo.[MKTSPONSORSHIPRECORDSOURCE]
      inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTSPONSORSHIPRECORDSOURCE].[QUERYVIEWCATALOGID]
      where [MKTSPONSORSHIPRECORDSOURCE].[ID] = @RECORDSOURCEID;

    select
      @DONORIDDATATYPE = (case when lower(t.[name]) in ('nvarchar', 'varchar', 'char') then 'varchar(' + cast(c.[max_length] as nvarchar(10)) + ')' else t.[name] end)
    from tempdb.sys.columns c
    inner join tempdb.sys.types t on t.[system_type_id] = c.[system_type_id] and t.[user_type_id] = c.[user_type_id]
    where c.[object_id] = object_id('tempdb..' + @EXCLUDEDIDSTEMPTABLENAME)
    and c.[name] = 'DONORID';



    /**** Mailing Universe ****/
    if object_id('tempdb..' + @TEMPUNIVERSETABLE) is not null
      begin
        select
          @DATATYPE = (case when lower(t.[name]) in ('nvarchar', 'varchar', 'char') then 'varchar(' + cast(c.[max_length] as nvarchar(10)) + ')' else t.[name] end)
        from tempdb.sys.columns c
        inner join tempdb.sys.types t on t.[system_type_id] = c.[system_type_id] and t.[user_type_id] = c.[user_type_id]
        where c.[object_id] = object_id('tempdb..' + @TEMPUNIVERSETABLE)
        and c.[name] = 'ID';

        --Check the data types of both tables to see if we need to cast the IDs...

        set @NEEDCAST = (case when @DONORIDDATATYPE <> @DATATYPE then 1 else 0 end);

        set @SQL = @INSERTSQL +
                   '  select ' + (case when @NEEDSDISTINCT = 1 then 'distinct' else '' end) + char(13) +
                   '    [EXCLUDEDIDS].[DONORID] as [DONORID],' + char(13) +
                   '    [EXCLUDEDIDS].[NAME] as [DONORNAME],' + char(13) +
                   '    [EXCLUDEDIDS].[SEGMENTNAME] as [EXCLUDEDFROMSEGMENT],' + char(13) +
                   '    '''' as [INCLUDEDINSEGMENT],' + char(13) +
                   '    ''Not in universe'' as [EXCLUSIONREASON],' + char(13) +
                   '    ''Universe'' as [EXCLUSIONTYPE],' + char(13) +
                   '    1 as [EXCLUSIONTYPECODE]' + char(13) +
                   '  from dbo.[' + @EXCLUDEDIDSTEMPTABLENAME + '] as [EXCLUDEDIDS]' + char(13);

        if @EFFORTTYPECODE = 0
          set @SQL += '  where not exists(select * from ' + @TEMPUNIVERSETABLE + ' as [UNIVERSE] where ' + @CASTBEGIN + '[UNIVERSE].[ID]' + @CASTEND + ' = ' + @CASTBEGIN + '[EXCLUDEDIDS].[DONORID]' + @CASTEND + ')';
        else
          begin
            set @SQL += '  inner join dbo.[' + @DONORTORECIPIENTCONVERSIONTABLENAME + '] on ' + @CASTBEGIN + '[' + @DONORTORECIPIENTCONVERSIONTABLENAME + '].[' + @DONORTORECIPIENTCONVERSIONDONORIDFIELDNAME + ']' + @CASTEND + ' = ' + @CASTBEGIN + '[EXCLUDEDIDS].[DONORID]' + @CASTEND + isnull(@DONORTORECIPIENTCONVERSIONEXTRAJOINCONDITION, '') + char(13);

            if @EFFORTTYPECODE = 2 -- membership

              set @SQL += '  inner join dbo.[MEMBERSHIP] on [MEMBERSHIP].[ID] = [' + @DONORTORECIPIENTCONVERSIONTABLENAME + '].[' + @DONORTORECIPIENTCONVERSIONRECIPIENTIDFIELDNAME + '] and [MEMBERSHIP].[STATUSCODE] <> 1' + char(13);

            set @SQL += '  where not exists(select * from ' + @TEMPUNIVERSETABLE + ' as [UNIVERSE] where [UNIVERSE].[ID] = [' + @DONORTORECIPIENTCONVERSIONTABLENAME + '].[' + @DONORTORECIPIENTCONVERSIONRECIPIENTIDFIELDNAME + '])';
          end

        if @NEEDCAST = 1
          set @SQL = replace(replace(@SQL, @CASTBEGIN, 'cast('), @CASTEND, ' as varchar(36))');
        else
          set @SQL = replace(replace(@SQL, @CASTBEGIN, ''), @CASTEND, '');

        --print @SQL + char(13);

        exec sp_executesql @SQL;
      end



    /**** Mailing Exclusions ****/
    if object_id('tempdb..' + @TEMPEXCLUSIONSTABLE) is not null
      begin
        select
          @DATATYPE = (case when lower(t.[name]) in ('nvarchar', 'varchar', 'char') then 'varchar(' + cast(c.[max_length] as nvarchar(10)) + ')' else t.[name] end)
        from tempdb.sys.columns c
        inner join tempdb.sys.types t on t.[system_type_id] = c.[system_type_id] and t.[user_type_id] = c.[user_type_id]
        where c.[object_id] = object_id('tempdb..' + @TEMPEXCLUSIONSTABLE)
        and c.[name] = 'ID';

        --Check the data types of both tables to see if we need to cast the IDs...

        set @NEEDCAST = (case when @DONORIDDATATYPE <> @DATATYPE then 1 else 0 end);

        --Exclusion TypeCodes:

        --1 = Exclusion selections

        --2 = Previous Marketing Effort exclusions

        --3 = Solicit codes

        --4 = Inactive

        --5 = Deceased

        set @SQL = @INSERTSQL +
                   '  select ' + (case when @NEEDSDISTINCT = 1 then 'distinct' else '' end) + char(13) +
                   '    [EXCLUDEDIDS].[DONORID] as [DONORID],' + char(13) +
                   '    [EXCLUDEDIDS].[NAME] as [DONORNAME],' + char(13) +
                   '    [EXCLUDEDIDS].[SEGMENTNAME] as [EXCLUDEDFROMSEGMENT],' + char(13) +
                   '    '''' as [INCLUDEDINSEGMENT],' + char(13) +
                   '    (case [EXCLUSIONS].[TYPECODE]' + char(13) +
                   '      when 1 then ''Included in "'' + [EXCLUSIONS].[REASON] + ''"''' + char(13) +
                   '      when 2 then ''Included in effort "'' + [EXCLUSIONS].[REASON] + ''"''' + char(13) +
                   '      when 3 then [EXCLUSIONS].[REASON]' + char(13) +
                   '      when 4 then ''Inactive''' + char(13) +
                   '      when 5 then ''Deceased''' + char(13) +
                   '     end) as [EXCLUSIONREASON],' + char(13) +
                   '    (case [EXCLUSIONS].[TYPECODE]' + char(13) +
                   '      when 1 then ''Exclusions''' + char(13) +
                   '      when 2 then ''Exclusions''' + char(13) +
                   '      when 3 then ''Contact Rules''' + char(13) +
                   '      when 4 then ''Contact Rules''' + char(13) +
                   '      when 5 then ''Contact Rules''' + char(13) +
                   '     end) as [EXCLUSIONTYPE],' + char(13) +
                   '    (case [EXCLUSIONS].[TYPECODE]' + char(13) +
                   '      when 1 then 2' + char(13) +
                   '      when 2 then 2' + char(13) +
                   '      when 3 then 3' + char(13) +
                   '      when 4 then 3' + char(13) +
                   '      when 5 then 3' + char(13) +
                   '     end) as [EXCLUSIONTYPECODE]' + char(13) +
                   '  from dbo.[' + @EXCLUDEDIDSTEMPTABLENAME + '] as [EXCLUDEDIDS]' + char(13);

        if @EFFORTTYPECODE = 0
          set @SQL += '  inner join dbo.[' + @TEMPEXCLUSIONSTABLE + '] as [EXCLUSIONS] on ' + @CASTBEGIN + '[EXCLUSIONS].[ID]' + @CASTEND + ' = ' + @CASTBEGIN + '[EXCLUDEDIDS].[DONORID]' + @CASTEND;
        else
          begin
            set @SQL += '  inner join dbo.[' + @DONORTORECIPIENTCONVERSIONTABLENAME + '] on ' + @CASTBEGIN + '[' + @DONORTORECIPIENTCONVERSIONTABLENAME + '].[' + @DONORTORECIPIENTCONVERSIONDONORIDFIELDNAME + ']' + @CASTEND + ' = ' + @CASTBEGIN + '[EXCLUDEDIDS].[DONORID]' + @CASTEND + isnull(@DONORTORECIPIENTCONVERSIONEXTRAJOINCONDITION, '') + char(13);

            if @EFFORTTYPECODE = 2 -- membership

              set @SQL += '  inner join dbo.[MEMBERSHIP] on [MEMBERSHIP].[ID] = [' + @DONORTORECIPIENTCONVERSIONTABLENAME + '].[' + @DONORTORECIPIENTCONVERSIONRECIPIENTIDFIELDNAME + '] and [MEMBERSHIP].[STATUSCODE] <> 1' + char(13);

            set @SQL += '  inner join dbo.[' + @TEMPEXCLUSIONSTABLE + '] as [EXCLUSIONS] on [EXCLUSIONS].[ID] = [' + @DONORTORECIPIENTCONVERSIONTABLENAME + '].[' + @DONORTORECIPIENTCONVERSIONRECIPIENTIDFIELDNAME + ']';
          end

        if @NEEDCAST = 1
          set @SQL = replace(replace(@SQL, @CASTBEGIN, 'cast('), @CASTEND, ' as varchar(36))');
        else
          set @SQL = replace(replace(@SQL, @CASTBEGIN, ''), @CASTEND, '');

        --print @SQL + char(13);

        exec sp_executesql @SQL;
      end



    /**** Household exclusions ****/
    if @EFFORTTYPECODE = 0 and @HOUSEHOLDINGTYPECODE <> 0 and @MARKETINGRECORDTYPE <> 2
      begin 
        declare @PARENTTABLENAME nvarchar(255);
        declare @PRIMARYKEYFIELD nvarchar(255);
        declare @HOUSEHOLDIDFIELD nvarchar(255);
        declare @ISHOUSEHOLDFIELD nvarchar(255);

        /* Get household ID field mappings */
        select
          @HOUSEHOLDIDFIELD = [MKTRECORDSOURCEFIELDMAPPINGS].[HOUSEHOLDIDFIELD],
          @ISHOUSEHOLDFIELD = [MKTRECORDSOURCEFIELDMAPPINGS].[ISHOUSEHOLDFIELD],
          @PARENTTABLENAME = [QUERYVIEWCATALOG].[OBJECTNAME],
          @PRIMARYKEYFIELD = [QUERYVIEWCATALOG].[PRIMARYKEYFIELD]
        from dbo.[MKTRECORDSOURCEFIELDMAPPINGS]
        inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTRECORDSOURCEFIELDMAPPINGS].[ID]
        where [MKTRECORDSOURCEFIELDMAPPINGS].[ID] = @RECORDSOURCEID;

        if exists(select * from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @PARENTTABLENAME and [COLUMN_NAME] = @HOUSEHOLDIDFIELD) and exists(select * from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @PARENTTABLENAME and [COLUMN_NAME] = @ISHOUSEHOLDFIELD)
          begin
            set @EXCLUSIONSTABLENAME = dbo.[UFN_MKTSEGMENTATIONSEGMENTCACHEHOUSEHOLDEXCLUSIONS_MAKETABLENAME](@RECORDSOURCEID);

            select
              @DATATYPE = (case when lower(t.[name]) in ('nvarchar', 'varchar', 'char') then 'varchar(' + cast(c.[max_length] as nvarchar(10)) + ')' else t.[name] end)
            from tempdb.sys.columns c
            inner join tempdb.sys.types t on t.[system_type_id] = c.[system_type_id] and t.[user_type_id] = c.[user_type_id]
            where c.[object_id] = object_id('tempdb..' + @EXCLUSIONSTABLENAME)
            and c.[name] = 'DONORID';

            --Check the data types of both tables to see if we need to cast the IDs...

            set @NEEDCAST = (case when @DONORIDDATATYPE <> @DATATYPE then 1 else 0 end);

            if @HOUSEHOLDINGTYPECODE = 1
              /* Household data with the segment containing the household member that made it into the effort */
              set @SQL = 'with [HOUSEHOLD] ([HOUSEHOLDID], [SEGMENTNAME]) as' + char(13) +
                         '(' + char(13) +
                         '  select distinct [QUERYVIEW].[' + @HOUSEHOLDIDFIELD + ']' + ', [MKTSEGMENT].[NAME]' + char(13) +
                         '  from dbo.[' + @DATATABLE + '] as [DATA]' + char(13) +
                         '  inner join dbo.[' + @PARENTTABLENAME + '] as [QUERYVIEW] on ' + @CASTBEGIN + '[QUERYVIEW].['+ @PRIMARYKEYFIELD + ']' + @CASTEND + ' = ' + @CASTBEGIN + '[DATA].[DONORID]' + @CASTEND + char(13) +
                         '  inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [DATA].[SEGMENTID]' + char(13) +
                         '  inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]' + char(13) +
                         ')' + char(13);
            else
              set @SQL = '';

            set @SQL += @INSERTSQL +
                        '  select distinct ' + char(13) + 
                        '    [EXCLUDEDIDS].[DONORID] as [DONORID],' + char(13) +
                        '    [EXCLUDEDIDS].[NAME] as [DONORNAME],' + char(13) +
                        '    [EXCLUDEDIDS].[SEGMENTNAME] as [EXCLUDEDFROMSEGMENT],' + char(13) +
                        '    '''' as [INCLUDEDINSEGMENT],' + char(13);

            if @HOUSEHOLDINGTYPECODE = 1 -- Qualifying individuals and organizations

              set @SQL += '    (case when [QUERYVIEW].[' + @ISHOUSEHOLDFIELD + '] = 0 then' + char(13) +
                          '       ''Household member in '' + ''"'' + [HOUSEHOLD].[SEGMENTNAME] + ''"''' + char(13) + 
                          '     else' + char(13) +
                          '       ''Constituent is household''' + char(13) +
                          '     end) as [EXCLUSIONREASON],'  + char(13) +
                          '    ''Householding: Qualifying individuals and organizations'' as [EXCLUSIONTYPE],' + char(13) +
                          '    4 as [EXCLUSIONTYPECODE]' + char(13);
            else -- Qualifying households

              set @SQL += '    ''Constituent is not household'' as [EXCLUSIONREASON],'  + char(13) +
                          '    ''Householding: Qualifying households'' as [EXCLUSIONTYPE],' + char(13) +
                          '    4 as [EXCLUSIONTYPECODE]' + char(13);

            set @SQL += '  from dbo.[' + @EXCLUDEDIDSTEMPTABLENAME + '] as [EXCLUDEDIDS]' + char(13) +
                        '  inner join dbo.[' + @EXCLUSIONSTABLENAME + '] as [HHEXC] on ' + @CASTBEGIN + '[HHEXC].[DONORID]' + @CASTEND + ' = ' + @CASTBEGIN + '[EXCLUDEDIDS].[DONORID]' + @CASTEND + char(13);

            if @HOUSEHOLDINGTYPECODE = 1
              set @SQL += '  inner join dbo.[' + @PARENTTABLENAME + '] as [QUERYVIEW] on [QUERYVIEW].['+ @PRIMARYKEYFIELD + '] = [HHEXC].[DONORID]' + char(13) +
                          '  left join [HOUSEHOLD] on [HOUSEHOLD].[HOUSEHOLDID] = [QUERYVIEW].[' + @HOUSEHOLDIDFIELD + ']' + char(13);

            set @SQL += '  inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [HHEXC].[SEGMENTID]' + char(13) +
                        '  inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]' + char(13) +
                        '  left join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]' + char(13) +
                        '  where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID' + char(13) +
                        '  and ([MKTSEGMENT].[SEGMENTTYPECODE] = 1 or ([MKTSEGMENT].[SEGMENTTYPECODE] = 2 and [MKTSEGMENTLIST].[TYPECODE] <> 1))' + char(13);

            if @HOUSEHOLDINGTYPECODE = 1
              /* These ids were excluded for other reasons and should not get marked as excluded for household reasons */
              set @SQL += '  and not ([HOUSEHOLD].[SEGMENTNAME] is null and [QUERYVIEW].[' + @ISHOUSEHOLDFIELD + '] = 0)'

            if @NEEDCAST = 1
              set @SQL = replace(replace(@SQL, @CASTBEGIN, 'cast('), @CASTEND, ' as varchar(36))');
            else
              set @SQL = replace(replace(@SQL, @CASTBEGIN, ''), @CASTEND, '');

            --print @SQL + char(13);

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



    /**** Address processing ****/
    if @EFFORTTYPECODE = 0 and @ISBBEC = 1 and @MARKETINGRECORDTYPE <> 2
      begin
        declare @ADDRESSPROCESSINGCACHETABLENAME nvarchar(128) = dbo.[UFN_MKTSEGMENTATIONSEGMENTCACHEADDRESSES_MAKETABLENAME](@SEGMENTATIONID);

        if exists(select * from INFORMATION_SCHEMA.TABLES where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @ADDRESSPROCESSINGCACHETABLENAME)
          begin
            set @SQL = @INSERTSQL +
                       '  /* Get only excluded IDs that were part of a mail channel segment that uses address processing */' + char(13) + 
                       '  select' + char(13) +
                       '    [EXCLUDEDIDS].[DONORID],' + char(13) +
                       '    [EXCLUDEDIDS].[NAME] as [DONORNAME],' + char(13) +
                       '    [EXCLUDEDIDS].[SEGMENTNAME] as [EXCLUDEDFROMSEGMENT],' + char(13) +
                       '    '''' as [INCLUDEDINSEGMENT],' + char(13) +
                       '    ''Mailing address processing'' as [EXCLUSIONREASON],' + char(13) +
                       '    ''Address Processing'' as [EXCLUSIONTYPE],' + char(13) +
                       '    5 as [EXCLUSIONTYPECODE]' + char(13) +
                       '  from dbo.[' + @EXCLUDEDIDSTEMPTABLENAME + '] as [EXCLUDEDIDS]' + char(13) +
                       '  inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[SEGMENTID] = [EXCLUDEDIDS].[SEGMENTID] and [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = ''' + convert(nvarchar(36), @SEGMENTATIONID) + '''' + char(13) +
                       '  inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID]' + char(13) +
                       '  inner join dbo.[MKTPACKAGE] on [MKTPACKAGE].[ID] = [MKTSEGMENTATIONSEGMENT].[PACKAGEID]' + char(13) +
                       '  left outer join dbo.[' + @ADDRESSPROCESSINGCACHETABLENAME + '] as [ADDRESSES] on [ADDRESSES].[CONSTITUENTID] = [EXCLUDEDIDS].[DONORID]' + char(13) +
                       '  where (([MKTSEGMENTATIONSEGMENT].[OVERRIDEADDRESSPROCESSING] = 1 and [MKTSEGMENTATIONSEGMENT].[USEADDRESSPROCESSING] = 1) or [MKTSEGMENTATION].[USEADDRESSPROCESSING] = 1)' + char(13) +
                       '  and [MKTPACKAGE].[CHANNELCODE] = 0' + char(13) +
                       '  and [ADDRESSES].[CONSTITUENTID] is null' + char(13);
            --print @SQL + char(13);

            exec sp_executesql @SQL;
          end

        /* Exclusions for email channel code */
        declare @EMAILADDRESSPROCESSINGCACHETABLENAME nvarchar(128) = dbo.[UFN_MKTSEGMENTATIONSEGMENTCACHEEMAILADDRESSES_MAKETABLENAME](@SEGMENTATIONID);

        if exists(select * from INFORMATION_SCHEMA.TABLES where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @EMAILADDRESSPROCESSINGCACHETABLENAME)
          begin
            set @SQL = @INSERTSQL +
                       '  /* Get only excluded IDs that were part of an email channel segment that uses address processing */' + char(13) + 
                       '  select' + char(13) +
                       '    [EXCLUDEDIDS].[DONORID],' + char(13) +
                       '    [EXCLUDEDIDS].[NAME] as [DONORNAME],' + char(13) +
                       '    [EXCLUDEDIDS].[SEGMENTNAME] as [EXCLUDEDFROMSEGMENT],' + char(13) +
                       '    '''' as [INCLUDEDINSEGMENT],' + char(13) +
                       '    ''Email address processing'' as [EXCLUSIONREASON],' + char(13) +
                       '    ''Address Processing'' as [EXCLUSIONTYPE],' + char(13) +
                       '    5 as [EXCLUSIONTYPECODE]' + char(13) +
                       '  from dbo.[' + @EXCLUDEDIDSTEMPTABLENAME + '] as [EXCLUDEDIDS]' + char(13) +
                       '  inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[SEGMENTID] = [EXCLUDEDIDS].[SEGMENTID] and [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = ''' + convert(nvarchar(36), @SEGMENTATIONID) + '''' + char(13) +
                       '  inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID]' + char(13) +
                       '  inner join dbo.[MKTPACKAGE] on [MKTPACKAGE].[ID] = [MKTSEGMENTATIONSEGMENT].[PACKAGEID]' + char(13) +
                       '  left outer join dbo.[' + @EMAILADDRESSPROCESSINGCACHETABLENAME + '] as [EMAILADDRESSES] on [EMAILADDRESSES].[CONSTITUENTID] = [EXCLUDEDIDS].[DONORID]' + char(13) +
                       '  where (([MKTSEGMENTATIONSEGMENT].[OVERRIDEADDRESSPROCESSING] = 1 and [MKTSEGMENTATIONSEGMENT].[USEADDRESSPROCESSING] = 1) or [MKTSEGMENTATION].[USEADDRESSPROCESSING] = 1)' + char(13) +
                       '  and [MKTPACKAGE].[CHANNELCODE] = 1' + char(13) +
                       '  and [EMAILADDRESSES].[CONSTITUENTID] is null' + char(13);
            --print @SQL + char(13);

            exec sp_executesql @SQL;
          end
      end



    /**** Previous Segment Exclusions ****/
    if @EFFORTTYPECODE <> 1 -- acknowledgement

      begin
        declare @DONORIDSQL nvarchar(128);
        declare @EXCLUSIONIDFIELDNAME nvarchar(128);

        set @EXCLUSIONSTABLENAME = dbo.[UFN_MKTSEGMENTATIONSEGMENTCACHEEXCLUSIONS_MAKETABLENAME](@RECORDSOURCEID);

        if @EFFORTTYPECODE = 0
          begin
            if @MARKETINGRECORDTYPE = 1 or @MARKETINGRECORDTYPE = 3
              set @EXCLUSIONIDFIELDNAME = 'DONORID'
            else if @MARKETINGRECORDTYPE = 2
              set @EXCLUSIONIDFIELDNAME = 'LISTDONORID';

            set @DONORIDSQL = '[EXCLUSIONS].[' + @EXCLUSIONIDFIELDNAME + ']';
          end
        else
          begin
            set @EXCLUSIONIDFIELDNAME = case @EFFORTTYPECODE when 3 then 'SPONSORSHIPID' else @DONORTORECIPIENTCONVERSIONRECIPIENTIDFIELDNAME end;
            set @DONORIDSQL = @CASTBEGIN + '[' + @DONORTORECIPIENTCONVERSIONTABLENAME + '].[' + @DONORTORECIPIENTCONVERSIONDONORIDFIELDNAME + ']' + @CASTEND;
          end

        select
          @DATATYPE = (case when lower(t.[name]) in ('nvarchar', 'varchar', 'char') then 'varchar(' + cast(c.[max_length] as nvarchar(10)) + ')' else t.[name] end)
        from tempdb.sys.columns c
        inner join tempdb.sys.types t on t.[system_type_id] = c.[system_type_id] and t.[user_type_id] = c.[user_type_id]
        where c.[object_id] = object_id('tempdb..' + @EXCLUSIONSTABLENAME)
        and c.[name] = @EXCLUSIONIDFIELDNAME;

        --Check the data types of both tables to see if we need to cast the IDs...

        set @NEEDCAST = (case when @DONORIDDATATYPE <> @DATATYPE then 1 else 0 end);

        set @SQL = @INSERTSQL +
                   '  select ' + (case when @NEEDSDISTINCT = 1 then 'distinct' else '' end) + char(13) +
                   '    ' + @DONORIDSQL + ' as [DONORID],' + char(13) +
                   '    [EXCLUDEDIDS].[NAME] as [DONORNAME],' + char(13) +
                   '    [EXCLUDEDIDS].[SEGMENTNAME] as [EXCLUDEDFROMSEGMENT],' + char(13) +
                   '    [MKTSEGMENT].[NAME] as [INCLUDEDINSEGMENT],' + char(13) +
                   '    case when [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 1 then ''Included in previous segment exclusion'' else ''Included in previous segment'' end as [EXCLUSIONREASON],' + char(13) +
                   '    ''Segmentation'' as [EXCLUSIONTYPE],' + char(13) +
                   '    case when [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 1 then 8 else 6 end as [EXCLUSIONTYPECODE]' + char(13) +
                   '  from dbo.[' + @EXCLUDEDIDSTEMPTABLENAME + '] as [EXCLUDEDIDS]' + char(13);

        if @EFFORTTYPECODE = 0
          set @SQL += '  inner join dbo.[' + @EXCLUSIONSTABLENAME + '] as [EXCLUSIONS] on ' + @CASTBEGIN + '[EXCLUSIONS].[' + @EXCLUSIONIDFIELDNAME + ']' + @CASTEND + ' = ' + @CASTBEGIN + '[EXCLUDEDIDS].[DONORID]' + @CASTEND + char(13)
        else
          begin
            set @SQL += '  inner join dbo.[' + @DONORTORECIPIENTCONVERSIONTABLENAME + '] on ' + @CASTBEGIN + '[' + @DONORTORECIPIENTCONVERSIONTABLENAME + '].[' + @DONORTORECIPIENTCONVERSIONDONORIDFIELDNAME + ']' + @CASTEND + ' = ' + @CASTBEGIN + '[EXCLUDEDIDS].[DONORID]' + @CASTEND + isnull(@DONORTORECIPIENTCONVERSIONEXTRAJOINCONDITION, '') + char(13);

            if @EFFORTTYPECODE = 2 -- membership

              set @SQL += '  inner join dbo.[MEMBERSHIP] on [MEMBERSHIP].[ID] = [' + @DONORTORECIPIENTCONVERSIONTABLENAME + '].[' + @DONORTORECIPIENTCONVERSIONRECIPIENTIDFIELDNAME + '] and [MEMBERSHIP].[STATUSCODE] <> 1' + char(13);

            set @SQL += '  inner join dbo.[' + @EXCLUSIONSTABLENAME + '] as [EXCLUSIONS] on [EXCLUSIONS].[' + @EXCLUSIONIDFIELDNAME + '] = [' + @DONORTORECIPIENTCONVERSIONTABLENAME + '].[' + @DONORTORECIPIENTCONVERSIONRECIPIENTIDFIELDNAME + ']' + char(13);
          end

        set @SQL += '  inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [EXCLUSIONS].[SEGMENTID]' + char(13) + 
                    '  inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]' + char(13) + 
                    '  left join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]' + char(13) + 
                    '  where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID' + char(13) +
                    '  and ([MKTSEGMENT].[SEGMENTTYPECODE] in (1, 3, 4, 5) or ([MKTSEGMENT].[SEGMENTTYPECODE] = 2 and [MKTSEGMENTLIST].[TYPECODE] <> 1))'

        if @NEEDCAST = 1
          set @SQL = replace(replace(@SQL, @CASTBEGIN, 'cast('), @CASTEND, ' as varchar(36))');
        else
          set @SQL = replace(replace(@SQL, @CASTBEGIN, ''), @CASTEND, '');

        --print @SQL + char(13);

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

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

  return 0;