USP_MKTSEGMENTATIONACTIVATE_UPDATESOURCECODES

Updates all the source codes in the non-activated marketing effort data table that may have changed since the last time segment record counts were run.

Parameters

Parameter Parameter Type Mode Description
@SEGMENTATIONID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.[USP_MKTSEGMENTATIONACTIVATE_UPDATESOURCECODES]

  @SEGMENTATIONID uniqueidentifier
)
as
  set nocount on;

  declare @ACTIVE bit;
  declare @SOURCECODEID uniqueidentifier;
  declare @SOURCECODEISHISTORICAL bit;
  declare @ENDEDONDATE datetime;
  declare @DATATABLE nvarchar(128);
  declare @SQL nvarchar(max);

  begin try
    select top 1
      @ACTIVE = [MKTSEGMENTATION].[ACTIVE],
      @SOURCECODEID = [MKTSEGMENTATION].[SOURCECODEID],
      @SOURCECODEISHISTORICAL = isnull([MKTSOURCECODE].[ISHISTORICAL], 0),
      @ENDEDONDATE = [BUSINESSPROCESSSTATUS].[ENDEDON]
    from dbo.[MKTSEGMENTATION]
    left outer join dbo.[MKTSOURCECODE] on [MKTSOURCECODE].[ID] = [MKTSEGMENTATION].[SOURCECODEID]
    left outer join dbo.[MKTSEGMENTATIONSEGMENTCALCULATEPROCESS] on [MKTSEGMENTATIONSEGMENTCALCULATEPROCESS].[SEGMENTATIONID] = [MKTSEGMENTATION].[ID]
    left outer join dbo.[MKTSEGMENTATIONSEGMENTCALCULATEPROCESSSTATUS] on [MKTSEGMENTATIONSEGMENTCALCULATEPROCESSSTATUS].[PARAMETERSETID] = [MKTSEGMENTATIONSEGMENTCALCULATEPROCESS].[ID]
    left outer join dbo.[BUSINESSPROCESSSTATUS] on [BUSINESSPROCESSSTATUS].[ID] = [MKTSEGMENTATIONSEGMENTCALCULATEPROCESSSTATUS].[ID]
    where [MKTSEGMENTATION].[ID] = @SEGMENTATIONID
    and isnull([BUSINESSPROCESSSTATUS].[STATUSCODE], 0) = 0
    order by [BUSINESSPROCESSSTATUS].[ENDEDON] desc;

    --Only update the sourcecodes for non-activated mailings...

    if @ACTIVE = 0 and @ENDEDONDATE is not null and @SOURCECODEISHISTORICAL = 0
      begin
        --See if we need to update sourcecodes by doing a basic compare of the date changed for:

        --  1) the mailing

        --  2) all the mailing's segments

        --  3) all the mailing's test segments

        --  4) all base segments in the mailing

        --  5) all packages in the mailing

        --  6) all lists in the mailing

        --  7) all sourcecode parts used by the mailing

        --  8) the recordsources used by the mailing

        --Any deletes of segments/tests will cause the record count cache to automatically

        --be invalidated, so we don't need to worry about that here.

        if @ENDEDONDATE < (select [DATECHANGED] from dbo.[MKTSEGMENTATION] where [ID] = @SEGMENTATIONID) or 
           @ENDEDONDATE < (select max([DATECHANGED]) from dbo.[MKTSEGMENTATIONSEGMENT] where [SEGMENTATIONID] = @SEGMENTATIONID) or
           @ENDEDONDATE < (select max([MKTSEGMENTATIONTESTSEGMENT].[DATECHANGED]) from dbo.[MKTSEGMENTATIONTESTSEGMENT] inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID] where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID) or
           @ENDEDONDATE < (select max([MKTSEGMENT].[DATECHANGED]) from dbo.[MKTSEGMENTATIONSEGMENT] inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID] where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID) or
           @ENDEDONDATE < (select max([MKTPACKAGE].[DATECHANGED]) from dbo.[MKTSEGMENTATIONPACKAGE] inner join dbo.[MKTPACKAGE] on [MKTPACKAGE].[ID] = [MKTSEGMENTATIONPACKAGE].[PACKAGEID] where [MKTSEGMENTATIONPACKAGE].[SEGMENTATIONID] = @SEGMENTATIONID) or
           @ENDEDONDATE < (select max([MKTLIST].[DATECHANGED]) from dbo.[MKTSEGMENTATIONSEGMENT] inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID] inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID] inner join dbo.[MKTLIST] on [MKTLIST].[ID] = [MKTSEGMENTLIST].[LISTID] where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID) or
           @ENDEDONDATE < (select max([MKTSOURCECODEITEM].[DATECHANGED]) from dbo.[MKTSOURCECODEITEM] inner join dbo.[MKTSOURCECODEPARTDEFINITION] on [MKTSOURCECODEPARTDEFINITION].[ID] = [MKTSOURCECODEITEM].[MKTSOURCECODEPARTDEFINITIONID] where [MKTSOURCECODEITEM].[SOURCECODEID] = @SOURCECODEID) or
           @ENDEDONDATE < (select max([MKTRECORDSOURCE].[DATECHANGED]) from dbo.[UFN_MKTSEGMENTATION_GETDISTINCTRECORDSOURCES](@SEGMENTATIONID) as [DRS] inner join dbo.[MKTRECORDSOURCE] on [MKTRECORDSOURCE].[ID] = [DRS].[QUERYVIEWCATALOGID])
          begin
            set @DATATABLE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME](@SEGMENTATIONID);

            if exists(select * from INFORMATION_SCHEMA.TABLES where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @DATATABLE)
              begin
                if @SOURCECODEID is null
                  begin
                    --Make sure the data table does not contain any previous sourcecodes since the mailing is not using sourcecodes...

                    set @SQL = 'update dbo.[' + @DATATABLE + '] set' + char(13) +
                               '  [SOURCECODE] = ''''' + char(13) +
                               'where [SOURCECODE] is null' + char(13) +
                               'or [SOURCECODE] <> ''''';
                    exec (@SQL);
                  end
                else
                  begin
                    --Update the data table to contain the current sourcecodes (if they changed)...

                    set @SQL = 'declare @SC table (' + char(13) +
                               '  [DONORQUERYVIEWCATALOGID] uniqueidentifier not null,' + char(13) +
                               '  [SEGMENTID] uniqueidentifier not null,' + char(13) +
                               '  [TESTSEGMENTID] uniqueidentifier,' + char(13) +
                               '  [OLDSOURCECODE] nvarchar(50) not null,' + char(13) +
                               '  [NEWSOURCECODE] nvarchar(50) not null' + char(13) +
                               ');' + char(13) +
                               char(13) +
                               '--Grab all distinct sourcecodes from the datatable...' + char(13) +

                               'insert into @SC ([DONORQUERYVIEWCATALOGID], [SEGMENTID], [TESTSEGMENTID], [OLDSOURCECODE], [NEWSOURCECODE])' + char(13) +
                               '  select distinct' + char(13) +
                               '    [DONORQUERYVIEWCATALOGID],' + char(13) +
                               '    [SEGMENTID],' + char(13) +
                               '    [TESTSEGMENTID],' + char(13) +
                               '    isnull([SOURCECODE], ''''),' + char(13) +
                               '    ''''' + char(13) +
                               '  from dbo.[' + @DATATABLE + '];' + char(13) +
                               char(13) +
                               '--Build new sourcecodes to see if any of the old sourcecodes need updated.  This statement is separate' + char(13) +

                               '--from the above insert to avoid the performance penalty of having to calculate sourcecodes for all' + char(13) +

                               '--records in the datatable and then perform the distinct operation.' + char(13) +

                               'update @SC set' + char(13) +
                               '  [NEWSOURCECODE] = dbo.[UFN_MKTSOURCECODE_BUILDCODE](isnull([TESTSEGMENTID], [SEGMENTID]), [DONORQUERYVIEWCATALOGID], null);' + char(13) +
                               char(13) +
                               '--Update any sourcecodes that are out-of-date...' + char(13) +

                               'if exists(select * from @SC where [OLDSOURCECODE] <> [NEWSOURCECODE])' + char(13) +
                               '  update dbo.[' + @DATATABLE + '] set' + char(13) +
                               '    [SOURCECODE] = [SC].[NEWSOURCECODE]' + char(13) +
                               '  from dbo.[' + @DATATABLE + '] as [DONORS]' + char(13) +
                               '  inner join @SC as [SC] on [SC].[DONORQUERYVIEWCATALOGID] = [DONORS].[DONORQUERYVIEWCATALOGID] and [SC].[SEGMENTID] = [DONORS].[SEGMENTID] and (([SC].[TESTSEGMENTID] is null and [DONORS].[TESTSEGMENTID] is null) or ([SC].[TESTSEGMENTID] = [DONORS].[TESTSEGMENTID]));';
                    exec (@SQL);
                  end
              end
          end
      end
  end try

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

  return 0;