USP_MKTSEGMENTATIONACTIVATE_POPULATETEMPSEGMENTTABLE

Populates the temporary table for activating a segment.

Parameters

Parameter Parameter Type Mode Description
@SEGMENTID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.[USP_MKTSEGMENTATIONACTIVATE_POPULATETEMPSEGMENTTABLE]
(
  @SEGMENTID uniqueidentifier
)
as
  set nocount on;

  declare @SEGMENTATIONID uniqueidentifier;
  declare @MAILINGREVENUEIDDATATYPE nvarchar(128);
  declare @TEMPTABLENAME nvarchar(128);
  declare @RECORDSOURCEID uniqueidentifier;
  declare @EXCLUSIONSTABLENAME nvarchar(128);
  declare @EXCLUSIONSIDFIELDNAME nvarchar(128);
  declare @EXCLUSIONSIDDATATYPE nvarchar(128);
  declare @HOUSEHOLDINGTYPECODE tinyint;
  declare @IDDATATYPE nvarchar(128);
  declare @REVENUEIDDATATYPE nvarchar(128);
  declare @LISTDONORIDDATATYPE nvarchar(128);
  declare @SQL nvarchar(max);
  declare @MKTSEGMENTID uniqueidentifier;
  declare @DONORSEXIST bit;
  declare @LISTDONORSEXIST bit;
  declare @MAILINGTYPECODE tinyint;
  declare @USETOP bit;
  declare @SAMPLESIZEEXCLUDEREMAINDER bit;
  declare @REVENUELETTERTABLENAME nvarchar(128);
  declare @ISBBEC bit;
  declare @NEEDCAST bit = 0;
  declare @PACKAGEID uniqueidentifier;

  declare @CONSTITRANKVIEWNAME nvarchar(128);
  declare @CONSTITRANKVALUECOLUMN nvarchar(128);
  declare @CONSTITRANKORDERDESC bit;
  declare @USETOPFORTEMPTABLEINSERT bit;

  begin try
    select
      @SEGMENTATIONID = [MKTSEGMENTATION].[ID],
      @TEMPTABLENAME = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETEMPSEGMENTTABLENAME]([MKTSEGMENTATIONSEGMENT].[ID]),
      @MKTSEGMENTID = [MKTSEGMENTATIONSEGMENT].[SEGMENTID],
      @RECORDSOURCEID = [MKTSEGMENT].[QUERYVIEWCATALOGID],
      @HOUSEHOLDINGTYPECODE = [MKTSEGMENTATION].[HOUSEHOLDINGTYPECODE],
      @MAILINGTYPECODE = [MKTSEGMENTATION].[MAILINGTYPECODE],
      @USETOP = (case when [MKTSEGMENTATIONSEGMENT].[SAMPLESIZEMETHODCODE] = 2 and not ([MKTSEGMENTATIONSEGMENT].[SAMPLESIZETYPECODE] = 0 and [MKTSEGMENTATIONSEGMENT].[SAMPLESIZE] = 100) then 1 else 0 end),
      @SAMPLESIZEEXCLUDEREMAINDER = [MKTSEGMENTATIONSEGMENT].[SAMPLESIZEEXCLUDEREMAINDER],
      @ISBBEC = dbo.[UFN_MKTRECORDSOURCE_VALIDFORBBEC]([MKTSEGMENT].[QUERYVIEWCATALOGID]),
      @EXCLUSIONSTABLENAME = dbo.[UFN_MKTSEGMENTATIONSEGMENTCACHEEXCLUSIONS_MAKETABLENAME]([MKTSEGMENT].[QUERYVIEWCATALOGID]),
      @PACKAGEID = [MKTSEGMENTATIONSEGMENT].[PACKAGEID]
    from dbo.[MKTSEGMENTATIONSEGMENT]
    inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID]
    inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
    where [MKTSEGMENTATIONSEGMENT].[ID] = @SEGMENTID;

    if @MAILINGTYPECODE = 1
      begin
        --Acknowledgement mailings...

        set @MAILINGREVENUEIDDATATYPE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_GETIDSETIDDATATYPE](@SEGMENTATIONID);
        set @REVENUELETTERTABLENAME = dbo.[UFN_MKTREVENUELETTER_MAKETABLENAME](@RECORDSOURCEID);
        set @LISTDONORSEXIST = 0;

        if @ISBBEC = 1
          --The same segment can be used across multiple acknowledgement rules, so we need to look for revenue letters with matching segments and packages.

          set @SQL = 'select @DONORSEXIST = ' + char(13) +
                     '(case when exists' + char(13) +
                     '  (select 1 from dbo.[' + @REVENUELETTERTABLENAME + '] as [RL]' + char(13) + 
                     '   inner join dbo.[REVENUELETTERMARKETING] as [RLM] on [RLM].[ID] = [RL].[ID]' + char(13) + 
                     '   where [RLM].[MKTSEGMENTATIONID] = @SEGMENTATIONID' + char(13) +
                     '   and [RLM].[MKTSEGMENTID] = @MKTSEGMENTID' + char(13) +
                     '   and [RLM].[MKTPACKAGEID] = @PACKAGEID' + char(13) +
                     '  ) then 1 else 0 end)';
        else
          set @SQL = 'select @DONORSEXIST = (case when exists(select 1 from dbo.[' + @REVENUELETTERTABLENAME + '] where [MKTSEGMENTATIONID] = @SEGMENTATIONID and [MKTSEGMENTID] = @MKTSEGMENTID) then 1 else 0 end)';

        exec sp_executesql @SQL, N'@SEGMENTATIONID uniqueidentifier, @MKTSEGMENTID uniqueidentifier, @PACKAGEID uniqueidentifier, @DONORSEXIST bit output', @SEGMENTATIONID = @SEGMENTATIONID, @MKTSEGMENTID = @MKTSEGMENTID, @PACKAGEID = @PACKAGEID, @DONORSEXIST = @DONORSEXIST output;
      end
    else if @MAILINGTYPECODE = 2
      begin
        --Membership mailings

        set @EXCLUSIONSIDFIELDNAME = 'MEMBERSHIPID';
        set @EXCLUSIONSIDDATATYPE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_GETIDSETIDDATATYPE](@SEGMENTATIONID);
        set @LISTDONORSEXIST = 0;

        set @SQL = 'select' + char(13) +
                   '  @DONORSEXIST = (case when exists(select 1 from dbo.[' + @EXCLUSIONSTABLENAME + '] where [SEGMENTID] = @SEGMENTID and [MEMBERSHIPID] is not null) then 1 else 0 end)';
        exec sp_executesql @SQL, N'@SEGMENTID uniqueidentifier, @DONORSEXIST bit output', @SEGMENTID = @SEGMENTID, @DONORSEXIST = @DONORSEXIST output;
      end
    else if @MAILINGTYPECODE = 3
      begin
        --Sponsorship mailings

        set @EXCLUSIONSIDFIELDNAME = 'SPONSORSHIPID';
        set @EXCLUSIONSIDDATATYPE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_GETIDSETIDDATATYPE](@SEGMENTATIONID);
        set @LISTDONORSEXIST = 0;

        set @SQL = 'select' + char(13) +
                   '  @DONORSEXIST = (case when exists(select 1 from dbo.[' + @EXCLUSIONSTABLENAME + '] where [SEGMENTID] = @SEGMENTID and [SPONSORSHIPID] is not null) then 1 else 0 end)';
        exec sp_executesql @SQL, N'@SEGMENTID uniqueidentifier, @DONORSEXIST bit output', @SEGMENTID = @SEGMENTID, @DONORSEXIST = @DONORSEXIST output;
      end
    else if @MAILINGTYPECODE = 5
      begin
        -- communication revenue

        set @EXCLUSIONSIDFIELDNAME = 'REVENUEID';
        set @EXCLUSIONSIDDATATYPE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_GETIDSETIDDATATYPE](@SEGMENTATIONID);
        set @LISTDONORSEXIST = 0;

        set @SQL = 'select' + char(13) +
                   '  @DONORSEXIST = (case when exists(select 1 from dbo.[' + @EXCLUSIONSTABLENAME + '] where [SEGMENTID] = @SEGMENTID and [REVENUEID] is not null) then 1 else 0 end)';
        exec sp_executesql @SQL, N'@SEGMENTID uniqueidentifier, @DONORSEXIST bit output, @LISTDONORSEXIST bit output', @SEGMENTID = @SEGMENTID, @DONORSEXIST = @DONORSEXIST output, @LISTDONORSEXIST = @LISTDONORSEXIST output;
      end
    else
      begin
        --Standard mailings...

        set @EXCLUSIONSIDFIELDNAME = 'DONORID';
        set @EXCLUSIONSIDDATATYPE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_GETDONORIDDATATYPE](@SEGMENTATIONID);

        set @SQL = 'select' + char(13) +
                   '  @DONORSEXIST = (case when exists(select 1 from dbo.[' + @EXCLUSIONSTABLENAME + '] where [SEGMENTID] = @SEGMENTID and [DONORID] is not null) then 1 else 0 end),' + char(13) +
                   '  @LISTDONORSEXIST = (case when exists(select 1 from dbo.[' + @EXCLUSIONSTABLENAME + '] where [SEGMENTID] = @SEGMENTID and [LISTDONORID] is not null) then 1 else 0 end)';
        exec sp_executesql @SQL, N'@SEGMENTID uniqueidentifier, @DONORSEXIST bit output, @LISTDONORSEXIST bit output', @SEGMENTID = @SEGMENTID, @DONORSEXIST = @DONORSEXIST output, @LISTDONORSEXIST = @LISTDONORSEXIST output;
      end

    if @DONORSEXIST = 1 or @LISTDONORSEXIST = 1
      begin
        --Insert all the segment donor IDs into the temp table...

        set @SQL = 'insert into dbo.[' + @TEMPTABLENAME + '] ([ID]' + (case when @MAILINGTYPECODE in (1, 5) and @ISBBEC = 1 then ', [DONORID]' else '' end) + ')' + char(13);

        if @DONORSEXIST = 1
          begin
            if @MAILINGTYPECODE = 1
              begin
                --Acknowledgement mailings...

                select @REVENUEIDDATATYPE = (case when lower([DATA_TYPE]) in ('nvarchar', 'varchar', 'char') then '[varchar](' + cast([CHARACTER_MAXIMUM_LENGTH] as nvarchar(10)) + ')' else [DATA_TYPE] end)
                from [INFORMATION_SCHEMA].[COLUMNS]
                where [TABLE_SCHEMA] = 'dbo'
                and [TABLE_NAME] = @REVENUELETTERTABLENAME
             and [COLUMN_NAME] = 'REVENUEID';

                set @SQL = @SQL + '  select ';

                if lower(@REVENUEIDDATATYPE) <> lower(@MAILINGREVENUEIDDATATYPE)
                  begin
                    set @SQL = @SQL + 'cast([RL].[REVENUEID] as ' + @MAILINGREVENUEIDDATATYPE + ')';
                    set @NEEDCAST = 1;
                  end
                else
                  set @SQL = @SQL + '[RL].[REVENUEID]';

                if @ISBBEC = 1
                  set @SQL = @SQL + ', [RL].[ACKNOWLEDGEEID]';

                set @SQL = @SQL + char(13) +
                           'from dbo.[' + @REVENUELETTERTABLENAME + '] as [RL]' + char(13);

                if @ISBBEC = 1
                  set @SQL = @SQL +
                             'inner join dbo.[REVENUELETTERMARKETING] as [RLM] on [RLM].[ID] = [RL].[ID]' + char(13) +
                             'where [RLM].[MKTSEGMENTATIONID] = @SEGMENTATIONID' + char(13) +
                             'and [RLM].[MKTSEGMENTID] = @MKTSEGMENTID' + char(13) +
                             'and [RLM].[MKTPACKAGEID] = @PACKAGEID' + char(13) +
                             'and [RL].[OUTOFDATE] = 0';
                else
                  set @SQL = @SQL +
                             'where [RL].[MKTSEGMENTATIONID] = @SEGMENTATIONID' + char(13) +
                             'and [RL].[MKTSEGMENTID] = @MKTSEGMENTID';
              end
            else
              begin
                --Standard/Membership/Sponsorship mailings

                --Locate the ranking data in case a segment uses top (@PREVUSETOP)

                --TODO: TommyVe 6/15/2009 We want to eventually extend this to not depend directly on a segmentation generator for the ranking data view

                -- AAW 11/19/09: Removing references to segmented appeal mailings/segmentation generator.  Leaving this code around in case DM

                -- finds it useful.

                --if @SAMPLESIZEEXCLUDEREMAINDER = 1 and @USETOP = 1 and @LISTDONORSEXIST = 0

                --  select top 1

                --    @CONSTITRANKVIEWNAME = ('SMARTFIELD' + replace(cast([SMARTFIELD].[TABLECATALOGID] as nvarchar(36)), '-', '')),

                --    @CONSTITRANKVALUECOLUMN = [SMARTFIELD].[VALUECOLUMNNAME],

                --    @CONSTITRANKORDERDESC = 1 --Always order by desc for smart field values

                --  from

                --    dbo.[SEGMENTEDAPPEALMAILING]

                --    inner join dbo.[SEGMENTATIONGENERATORDIMENSION] on [SEGMENTEDAPPEALMAILING].[SEGMENTATIONGENERATORID] = [SEGMENTATIONGENERATORDIMENSION].[SEGMENTATIONGENERATORID]

                --    inner join dbo.[SMARTFIELD] on [SEGMENTATIONGENERATORDIMENSION].[SMARTFIELDID] = [SMARTFIELD].[ID]

                --    inner join dbo.[SMARTFIELDCATALOG] on [SMARTFIELD].[SMARTFIELDCATALOGID] = [SMARTFIELDCATALOG].[ID]

                --  where

                --    [SEGMENTEDAPPEALMAILING].[ID] = @SEGMENTATIONID

                --  order by

                --    [SEGMENTATIONGENERATORDIMENSION].[SEQUENCE];


                set @USETOPFORTEMPTABLEINSERT = case when @SAMPLESIZEEXCLUDEREMAINDER = 1 and @USETOP = 1 and @LISTDONORSEXIST = 0 and @CONSTITRANKVIEWNAME is not null then 1 else 0 end;

                select @IDDATATYPE = (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] = @EXCLUSIONSIDFIELDNAME;

                -- (distinct is necessary with the addition of address processing to the mailing activation process:

                --  if an address processing option set is selected that causes mail to be sent to more than one contact at an

                --  organization, that organization's ID will appear more than once in the view from which this table is generated)

                if @USETOPFORTEMPTABLEINSERT = 1
                  set @SQL = @SQL + '  select [RANKEDEXC].[' + @EXCLUSIONSIDFIELDNAME + ']' + char(13) + 
                             '  from' + char(13) +
                             '  (select distinct [CONSTITSRANK].[' + @CONSTITRANKVALUECOLUMN + '] as [RANKVALUE], ';
                else
                  set @SQL = @SQL + '  select distinct ';

                if lower(@IDDATATYPE) <> lower(@EXCLUSIONSIDDATATYPE)
                  begin
                    set @SQL = @SQL + 'cast([EXC].[' + @EXCLUSIONSIDFIELDNAME + '] as ' + @EXCLUSIONSIDDATATYPE + ') as [' + @EXCLUSIONSIDFIELDNAME + ']';
                    set @NEEDCAST = 1;
                  end
                else
                  set @SQL = @SQL + '[EXC].[' + @EXCLUSIONSIDFIELDNAME + '] as [' + @EXCLUSIONSIDFIELDNAME + ']';

                if @MAILINGTYPECODE = 5
                  set @SQL = @SQL + ', [FINANCIALTRANSACTION].[CONSTITUENTID] ';

                set @SQL = @SQL + char(13) +
                           '  from dbo.[' + @EXCLUSIONSTABLENAME + '] as [EXC]' + char(13);

                if @MAILINGTYPECODE = 5
                  set @SQL = @SQL + ' inner join dbo.[FINANCIALTRANSACTION] on [FINANCIALTRANSACTION].[ID] = ' + '[EXC].[' + @EXCLUSIONSIDFIELDNAME + '] ';

                if @MAILINGTYPECODE = 0 and @HOUSEHOLDINGTYPECODE <> 0
                  set @SQL = @SQL + '  left join dbo.[' + dbo.[UFN_MKTSEGMENTATIONSEGMENTCACHEHOUSEHOLDEXCLUSIONS_MAKETABLENAME](@RECORDSOURCEID) + '] as [HHEXC] on [HHEXC].[SEGMENTID] = [EXC].[SEGMENTID] and [HHEXC].[DONORID] = [EXC].[DONORID]' + char(13);

                if @SAMPLESIZEEXCLUDEREMAINDER = 1 and @USETOP = 1 and @LISTDONORSEXIST = 0 and @CONSTITRANKVIEWNAME is not null
                  set @SQL = @SQL + '  left join [' + @CONSTITRANKVIEWNAME + '] as [CONSTITSRANK] on [CONSTITSRANK].[ID] = [EXC].[DONORID]' + char(13);

                set @SQL = @SQL + '  where [EXC].[SEGMENTID] = @SEGMENTID' + char(13) +
                                  '  and [EXC].[' + @EXCLUSIONSIDFIELDNAME + '] is not null';

                if @MAILINGTYPECODE = 0 and @HOUSEHOLDINGTYPECODE <> 0
                  set @SQL = @SQL + char(13) + '  and [HHEXC].[DONORID] is null';

                if @USETOPFORTEMPTABLEINSERT = 1
                  set @SQL = @SQL + char(13) + '  ) [RANKEDEXC]'+ char(13) +
                             '  order by [RANKEDEXC].[RANKVALUE]' + (case when @CONSTITRANKORDERDESC = 1 then ' desc' else '' end);
              end
          end

        if @MAILINGTYPECODE = 0 and @LISTDONORSEXIST = 1
          begin
            if @DONORSEXIST = 1
              set @SQL = @SQL + char(13) + '  union' + char(13);
            set @SQL = @SQL + '  select ';

            select @LISTDONORIDDATATYPE = (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] = 'LISTDONORID';

            if lower(@LISTDONORIDDATATYPE) <> lower(@EXCLUSIONSIDDATATYPE)
              begin
                set @SQL = @SQL + 'cast([LISTDONORID] as ' + @EXCLUSIONSIDDATATYPE + ')';
                set @NEEDCAST = 1;
              end
            else
              set @SQL = @SQL + '[LISTDONORID]';

            set @SQL = @SQL + char(13) +
                       '  from dbo.[' + @EXCLUSIONSTABLENAME + ']' + char(13) +
                       '  where [SEGMENTID] = @SEGMENTID' + char(13) +
                   '  and [LISTDONORID] is not null';
          end

        --print @SQL;


        if @MAILINGTYPECODE = 1
          begin
            --Acknowledgement mailings...

            exec sp_executesql @SQL, N'@SEGMENTATIONID uniqueidentifier, @MKTSEGMENTID uniqueidentifier, @PACKAGEID uniqueidentifier', @SEGMENTATIONID = @SEGMENTATIONID, @MKTSEGMENTID = @MKTSEGMENTID, @PACKAGEID = @PACKAGEID;
          end
        else
          begin
            --Standard/Membership/Sponsorship mailings

            --Try to improve performance by adding a join hint to the sql. If the hint fails, then execute the sql without it.

            begin try
              declare @SQLWITHJOINHINT nvarchar(max);
              if @NEEDCAST = 1
                set @SQLWITHJOINHINT = @SQL + char(13) + '  option (hash join, merge join)';
              else
                set @SQLWITHJOINHINT = @SQL;
              exec dbo.[USP_MKTSEGMENT_GETAPPLOCK] @MKTSEGMENTID, 0;
              exec sp_executesql @SQLWITHJOINHINT, N'@SEGMENTID uniqueidentifier', @SEGMENTID = @SEGMENTID;
              exec dbo.[USP_MKTSEGMENT_RELEASEAPPLOCK] @MKTSEGMENTID, 0;
            end try
            begin catch
              if ERROR_NUMBER() = 8622
                begin
                  exec sp_executesql @SQL, N'@SEGMENTID uniqueidentifier', @SEGMENTID = @SEGMENTID;
                  exec dbo.[USP_MKTSEGMENT_RELEASEAPPLOCK] @MKTSEGMENTID, 0;
                end
              else
                begin
                  exec dbo.[USP_RAISE_ERROR];
                  exec dbo.[USP_MKTSEGMENT_RELEASEAPPLOCK] @MKTSEGMENTID, 0;
                  return 1;
                end
            end catch
          end

        if @MAILINGTYPECODE not in (1, 5)
          begin
            set @SQL = 'update statistics dbo.[' + @TEMPTABLENAME + '] [PK_' + replace(@TEMPTABLENAME, '#', '') + ']';
            exec (@SQL);
          end
      end
  end try

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

  return 0;