USP_MKTSEGMENTATIONACTIVATE_CACHEREVENUESEGMENTS
Saves the activated marketing effort's revenue and segment relationships.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SEGMENTATIONID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.[USP_MKTSEGMENTATIONACTIVATE_CACHEREVENUESEGMENTS]
(
@SEGMENTATIONID uniqueidentifier
)
as
set nocount on;
declare @DATATABLE nvarchar(128);
declare @MAILINGTYPECODE tinyint;
declare @SOURCECODEID uniqueidentifier;
declare @DONORMATCHFIELD nvarchar(20);
declare @RECORDSOURCEID uniqueidentifier;
declare @GIFTIDSETNAME nvarchar(128);
declare @REVENUESEGMENTTABLE nvarchar(128);
declare @LISTMATCHBACKTABLE nvarchar(128);
declare @REVENUEDATATYPENAME nvarchar(20);
declare @SEGMENTID uniqueidentifier;
declare @TESTSEGMENTID uniqueidentifier;
declare @RECORDSOURCETYPE tinyint; /* 1=Record Source, 2=List/Duplicate List, 3=Consolidated List */
declare @LISTID uniqueidentifier;
declare @DONORQUERYVIEWID uniqueidentifier;
declare @SOURCECODEMAPID uniqueidentifier;
declare @SEGMENTSOURCECODE nvarchar(50);
declare @ISFIRSTSEGMENTWITHTHISSOURCECODE bit;
declare @NEEDCAST bit;
declare @WITHBLOCKSQL nvarchar(max);
declare @SQL nvarchar(max);
declare @WHERESQL nvarchar(max);
declare @PARAMDEF nvarchar(max);
begin try
select
@DATATABLE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME]([ID]),
@MAILINGTYPECODE = [MAILINGTYPECODE],
@SOURCECODEID = [SOURCECODEID]
from dbo.[MKTSEGMENTATION]
where [ID] = @SEGMENTATIONID;
if @MAILINGTYPECODE in (1, 2, 3) -- acknowledgment, membership, or sponsorship mailings
--For acknowledgment/membership/sponsorship mailings, the same donor could be in the mailing more than once because he is receiving an
--acknowledgment for multiple gifts, or being mailed as a result of multiple memberships, or multiple sponsorships.
--Joining on DONORID causes duplicate records in the counts, so join on the FINDERNUMBER field instead.
set @DONORMATCHFIELD = 'FINDERNUMBER';
else
set @DONORMATCHFIELD = 'DONORID';
--Create a temp table of all segment IDs in the mailing...
create table #MAILINGSEGMENTS (
[ID] uniqueidentifier not null primary key
);
--Create a table to use for matching gifts based on sourcecode...
if @SOURCECODEID is not null
begin
create table #MAILINGSOURCECODES (
[SOURCECODE] nvarchar(50) collate database_default not null,
[SEGMENTID] uniqueidentifier not null,
[TESTSEGMENTID] uniqueidentifier,
[SEGMENTSEQUENCE] int not null,
[TESTSEGMENTSEQUENCE] int not null
);
create clustered index [IX_MAILINGSOURCECODES_SOURCECODE] on #MAILINGSOURCECODES ([SOURCECODE]);
end
/* Loop through each record source in this mailing because we have a separate REVENUESEGMENT table for each record source */
declare RECORDSOURCECURSOR cursor local fast_forward for
select
[RS].[QUERYVIEWCATALOGID],
dbo.[UFN_MKTSELECTION_GETFUNCTIONNAME]([MKTSEGMENTATIONACTIVATE].[NORMALGIFTIDSETREGISTERID]),
dbo.[UFN_REVENUESEGMENT_MAKETABLENAME]([RS].[QUERYVIEWCATALOGID]),
dbo.[UFN_MKTRECORDSOURCE_MAKEMATCHBACKTABLENAME]([RS].[QUERYVIEWCATALOGID]),
[QUERYVIEWCATALOG].[PRIMARYKEYTYPENAME]
from dbo.[UFN_MKTSEGMENTATION_GETDISTINCTRECORDSOURCES](@SEGMENTATIONID) as [RS]
inner join dbo.[MKTSEGMENTATIONACTIVATE] on [MKTSEGMENTATIONACTIVATE].[SEGMENTATIONID] = @SEGMENTATIONID and [MKTSEGMENTATIONACTIVATE].[RECORDSOURCEID] = [RS].[QUERYVIEWCATALOGID]
inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [RS].[QUERYVIEWCATALOGID];
open RECORDSOURCECURSOR;
fetch next from RECORDSOURCECURSOR into @RECORDSOURCEID, @GIFTIDSETNAME, @REVENUESEGMENTTABLE, @LISTMATCHBACKTABLE, @REVENUEDATATYPENAME;
while (@@FETCH_STATUS = 0)
begin
--Create a temp table to hold the results for each segment. We'll then merge this temp table into the REVENUESEGMENT table for each record source...
create table #REVSEGTEMP (
/*[REVENUEID] column will be added below dynamically*/
[SEGMENTID] uniqueidentifier not null,
[TESTSEGMENTID] uniqueidentifier,
[SOURCECODEMAPID] uniqueidentifier
);
--Alter the temp table and add the REVENUEID column with the correct datatype. We do this because we can't create the
--temp table in dynamic sql because it will not stay in scope afterwards.
set @SQL = 'alter table #REVSEGTEMP add [REVENUEID] ' + @REVENUEDATATYPENAME + ' not null primary key';
exec (@SQL);
--Grab all the segments for this mailing and record source combination...
truncate table #MAILINGSEGMENTS;
insert into #MAILINGSEGMENTS ([ID])
select [MKTSEGMENTATIONSEGMENT].[ID]
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
and [MKTSEGMENT].[QUERYVIEWCATALOGID] = @RECORDSOURCEID;
--Grab all the sourcecodes for this mailing and record source combination so we can match gifts based on sourcecode too...
if @SOURCECODEID is not null
begin
truncate table #MAILINGSOURCECODES;
insert into #MAILINGSOURCECODES ([SOURCECODE], [SEGMENTID], [TESTSEGMENTID], [SEGMENTSEQUENCE], [TESTSEGMENTSEQUENCE])
select
[MKTSOURCECODEMAP].[SOURCECODE],
[MKTSOURCECODEMAP].[SEGMENTATIONSEGMENTID] as [SEGMENTID],
[MKTSOURCECODEMAP].[SEGMENTATIONTESTSEGMENTID] as [TESTSEGMENTID],
[MKTSEGMENTATIONSEGMENT].[SEQUENCE] as [SEGMENTSEQUENCE],
isnull([MKTSEGMENTATIONTESTSEGMENT].[SEQUENCE], 0) as [TESTSEGMENTSEQUENCE]
from dbo.[MKTSOURCECODEMAP]
inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [MKTSOURCECODEMAP].[SEGMENTATIONSEGMENTID]
left join dbo.[MKTSEGMENTATIONTESTSEGMENT] on [MKTSEGMENTATIONTESTSEGMENT].[ID] = [MKTSOURCECODEMAP].[SEGMENTATIONTESTSEGMENTID]
where [MKTSOURCECODEMAP].[SEGMENTATIONID] = @SEGMENTATIONID
and [MKTSOURCECODEMAP].[DONORQUERYVIEWCATALOGID] = @RECORDSOURCEID;
end
--See if we'll need to cast the person ID...
select
@NEEDCAST = (case when [DATA_TYPE] = 'uniqueidentifier' then 0 else 1 end)
from [INFORMATION_SCHEMA].[COLUMNS]
where [TABLE_SCHEMA] = 'dbo'
and [TABLE_NAME] = @DATATABLE
and [COLUMN_NAME] = 'DONORID';
--For debug only...
--declare @COUNT int = 0;
--declare @TOTAL int;
--declare @STATUS nvarchar(100);
--set @TOTAL = (
-- (select count(*)
-- from dbo.[MKTSEGMENTATIONSEGMENT]
-- inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
-- where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
-- and [MKTSEGMENT].[QUERYVIEWCATALOGID] = @RECORDSOURCEID)
-- +
-- (select count(*)
-- from dbo.[MKTSEGMENTATIONSEGMENT]
-- inner join dbo.[MKTSEGMENTATIONTESTSEGMENT] on [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID] = [MKTSEGMENTATIONSEGMENT].[ID]
-- inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
-- where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
-- and [MKTSEGMENT].[QUERYVIEWCATALOGID] = @RECORDSOURCEID)
--);
/* Loop through each segment and test segment in the mailing for this record source and insert the */
/* revenue IDs into the REVENUESEGMENT table. Only grab the segments that use this record source */
/* and make sure we process them in top-down order. */
declare SEGMENTCURSOR cursor local fast_forward for
select T.[SEGMENTID], T.[TESTSEGMENTID]
from (
select
[MKTSEGMENTATIONSEGMENT].[ID] as [SEGMENTID],
null as [TESTSEGMENTID],
[MKTSEGMENTATIONSEGMENT].[SEQUENCE] as [SEGMENTSEQUENCE],
null as [TESTSEGMENTSEQUENCE]
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
and [MKTSEGMENT].[QUERYVIEWCATALOGID] = @RECORDSOURCEID
union all
select
[MKTSEGMENTATIONSEGMENT].[ID] as [SEGMENTID],
[MKTSEGMENTATIONTESTSEGMENT].[ID] as [TESTSEGMENTID],
[MKTSEGMENTATIONSEGMENT].[SEQUENCE] as [SEGMENTSEQUENCE],
[MKTSEGMENTATIONTESTSEGMENT].[SEQUENCE] as [TESTSEGMENTSEQUENCE]
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENTATIONTESTSEGMENT] on [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID] = [MKTSEGMENTATIONSEGMENT].[ID]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
and [MKTSEGMENT].[QUERYVIEWCATALOGID] = @RECORDSOURCEID
) as T
order by T.[SEGMENTSEQUENCE], T.[TESTSEGMENTSEQUENCE];
open SEGMENTCURSOR;
fetch next from SEGMENTCURSOR into @SEGMENTID, @TESTSEGMENTID;
while (@@FETCH_STATUS = 0)
begin
--For debug only...
--set @COUNT += 1;
--set @STATUS = 'Calculating segment ' + cast(@COUNT as nvarchar(10)) + ' of ' + cast(@TOTAL as nvarchar(10)) + '...';
--raiserror(@STATUS, 0, 0) with nowait;
/* Gather some info so we can build the SQL */
if @TESTSEGMENTID is not null
select distinct
@RECORDSOURCETYPE = dbo.[UFN_MKTSEGMENT_GETMARKETINGRECORDTYPE]([MKTSEGMENT].[ID]),
@LISTID = [MKTSEGMENTLIST].[LISTID],
@DONORQUERYVIEWID = (case when [MKTSEGMENTLIST].[ID] is not null then isnull([MKTSEGMENTLIST].[QUERYVIEWCATALOGID], [MKTSEGMENTLIST_PARENT].[QUERYVIEWCATALOGID]) else @RECORDSOURCEID end),
@SOURCECODEMAPID = [MKTSOURCECODEMAP].[ID],
@SEGMENTSOURCECODE = [MKTSOURCECODEMAP].[SOURCECODE]
from dbo.[MKTSEGMENTATIONTESTSEGMENT]
inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID]
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.[MKTSEGMENTLIST] as [MKTSEGMENTLIST_PARENT] on [MKTSEGMENTLIST_PARENT].[SEGMENTID] = [MKTSEGMENTLIST].[PARENTSEGMENTID]
left join dbo.[MKTSOURCECODEMAP] on [MKTSOURCECODEMAP].[SEGMENTATIONSEGMENTID] = [MKTSEGMENTATIONSEGMENT].[ID] and [MKTSOURCECODEMAP].[SEGMENTATIONTESTSEGMENTID] = [MKTSEGMENTATIONTESTSEGMENT].[ID] and [MKTSOURCECODEMAP].[DONORQUERYVIEWCATALOGID] = @RECORDSOURCEID and ([MKTSEGMENTLIST].[LISTID] is null or [MKTSOURCECODEMAP].[LISTID] = [MKTSEGMENTLIST].[LISTID])
where [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID] = @SEGMENTID
and [MKTSEGMENTATIONTESTSEGMENT].[ID] = @TESTSEGMENTID;
else
select distinct
@RECORDSOURCETYPE = dbo.[UFN_MKTSEGMENT_GETMARKETINGRECORDTYPE]([MKTSEGMENT].[ID]),
@LISTID = [MKTSEGMENTLIST].[LISTID],
@DONORQUERYVIEWID = (case when [MKTSEGMENTLIST].[ID] is not null then isnull([MKTSEGMENTLIST].[QUERYVIEWCATALOGID], [MKTSEGMENTLIST_PARENT].[QUERYVIEWCATALOGID]) else @RECORDSOURCEID end),
@SOURCECODEMAPID = [MKTSOURCECODEMAP].[ID],
@SEGMENTSOURCECODE = [MKTSOURCECODEMAP].[SOURCECODE]
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.[MKTSEGMENTLIST] as [MKTSEGMENTLIST_PARENT] on [MKTSEGMENTLIST_PARENT].[SEGMENTID] = [MKTSEGMENTLIST].[PARENTSEGMENTID]
left join dbo.[MKTSOURCECODEMAP] on [MKTSOURCECODEMAP].[SEGMENTATIONSEGMENTID] = [MKTSEGMENTATIONSEGMENT].[ID] and [MKTSOURCECODEMAP].[SEGMENTATIONTESTSEGMENTID] is null and [MKTSOURCECODEMAP].[DONORQUERYVIEWCATALOGID] = @RECORDSOURCEID and ([MKTSEGMENTLIST].[LISTID] is null or [MKTSOURCECODEMAP].[LISTID] = [MKTSEGMENTLIST].[LISTID])
where [MKTSEGMENTATIONSEGMENT].[ID] = @SEGMENTID;
--Check if the sourcecode matches this segment/test segment and it is the first one in the mailing (top-down) if the mailing contains duplicate sourecodes.
if @SOURCECODEID is not null
begin
if exists(select *
from (
select top(1) [SEGMENTID], [TESTSEGMENTID]
from #MAILINGSOURCECODES
where [SOURCECODE] = @SEGMENTSOURCECODE
order by [SEGMENTSEQUENCE], [TESTSEGMENTSEQUENCE]
) as T
where T.[SEGMENTID] = @SEGMENTID
and ((@TESTSEGMENTID is null and T.[TESTSEGMENTID] is null) or T.[TESTSEGMENTID] = @TESTSEGMENTID))
set @ISFIRSTSEGMENTWITHTHISSOURCECODE = 1;
else
set @ISFIRSTSEGMENTWITHTHISSOURCECODE = 0;
end
else
set @ISFIRSTSEGMENTWITHTHISSOURCECODE = 0;
set @WITHBLOCKSQL = 'with [SEGMENTDONORS] ([' + @DONORMATCHFIELD + ']' + (case when @RECORDSOURCETYPE = 2 then ', [GIFTID]' else '' end) + ') as' + char(13) +
'(' + char(13) +
' select ' + (case when @RECORDSOURCETYPE = 2 then '[LISTDONORS].[DONORID], [LISTDONORS].[GIFTID]' else '[DONORS].[' + @DONORMATCHFIELD + ']' end) + char(13) +
' from dbo.[' + @DATATABLE + '] as [DONORS]' + char(13) +
(case when @RECORDSOURCETYPE = 2 then ' inner join dbo.[' + @LISTMATCHBACKTABLE + '] as [LISTDONORS] on ' + (case when @NEEDCAST = 1 then 'cast([LISTDONORS].[ID] as nvarchar(36))' else '[LISTDONORS].[ID]' end) + ' = [DONORS].[DONORID] and [LISTDONORS].[SEGMENTATIONID] = @SEGMENTATIONID' + char(13) else '' end) +
' where [DONORS].[DONORQUERYVIEWCATALOGID] ' + (case when @DONORQUERYVIEWID is null then 'is null' else '= @DONORQUERYVIEWID' end) + char(13) +
' and [DONORS].[SEGMENTID] = @SEGMENTID' + char(13) +
' and [DONORS].[TESTSEGMENTID] ' + (case when @TESTSEGMENTID is null then 'is null' else '= @TESTSEGMENTID' end) + char(13) +
' and [DONORS].[FINDERNUMBER] ' + (case when @DONORQUERYVIEWID is null then '< 0' else '> 0' end) + char(13) +
')';
if @RECORDSOURCETYPE in (1, 2) --Record Source or List/Duplicate List
begin
set @SQL = @WITHBLOCKSQL + char(13) +
'insert into #REVSEGTEMP ([REVENUEID], [SEGMENTID], [TESTSEGMENTID], [SOURCECODEMAPID])' + char(13) +
' select distinct [GIFTIDSET].[ID], @SEGMENTID, @TESTSEGMENTID, @SOURCECODEMAPID' + char(13) +
' from dbo.' + @GIFTIDSETNAME + ' as [GIFTIDSET]' + char(13) +
' inner join [SEGMENTDONORS] on [SEGMENTDONORS].[' + @DONORMATCHFIELD + '] = [GIFTIDSET].[' + @DONORMATCHFIELD + ']' + (case when @RECORDSOURCETYPE = 2 then ' and [SEGMENTDONORS].[GIFTID] = [GIFTIDSET].[ID]' else '' end) + char(13) +
' where not exists(select * from #REVSEGTEMP where [REVENUEID] = [GIFTIDSET].[ID])' + char(13) +
' option (optimize for (@SEGMENTID unknown, @TESTSEGMENTID unknown));';
if @ISFIRSTSEGMENTWITHTHISSOURCECODE = 1
--If we have the first segment in the mailing with this sourcecode (mailings could have duplicate sourcecodes), then...
-- * Count gift if source code matches, and...
-- * If the DONORID will not be matched to any other segment above or below this one...
set @SQL += char(13) + char(13) +
'with [NONSEGMENTDONORS] ([' + @DONORMATCHFIELD + ']) as' + char(13) +
'(' + char(13) +
' select ' + (case when @RECORDSOURCETYPE = 2 then '[LISTDONORS].[DONORID]' else '[DONORS].[' + @DONORMATCHFIELD + ']' end) + char(13) +
' from dbo.[' + @DATATABLE + '] as [DONORS]' + char(13) +
(case when @RECORDSOURCETYPE = 2 then ' inner join dbo.[' + @LISTMATCHBACKTABLE + '] as [LISTDONORS] on ' + (case when @NEEDCAST = 1 then 'cast([LISTDONORS].[ID] as nvarchar(36))' else '[LISTDONORS].[ID]' end) + ' = [DONORS].[DONORID] and [LISTDONORS].[SEGMENTATIONID] = @SEGMENTATIONID' + char(13) else '' end) +
' where [DONORS].[DONORQUERYVIEWCATALOGID] ' + (case when @DONORQUERYVIEWID is null then 'is null' else '= @DONORQUERYVIEWID' end) + char(13) +
' and not ([DONORS].[SEGMENTID] = @SEGMENTID and [DONORS].[TESTSEGMENTID] ' + (case when @TESTSEGMENTID is null then 'is null' else '= @TESTSEGMENTID' end) + ')' + char(13) +
' and [DONORS].[FINDERNUMBER] ' + (case when @DONORQUERYVIEWID is null then '< 0' else '> 0' end) + char(13) +
')' + char(13) +
'insert into #REVSEGTEMP ([REVENUEID], [SEGMENTID], [TESTSEGMENTID], [SOURCECODEMAPID])' + char(13) +
' select [GIFTIDSET].[ID], @SEGMENTID, @TESTSEGMENTID, @SOURCECODEMAPID' + char(13) +
' from dbo.' + @GIFTIDSETNAME + ' as [GIFTIDSET]' + char(13) +
' where not exists(select * from #REVSEGTEMP where [REVENUEID] = [GIFTIDSET].[ID])' + char(13) +
' and [GIFTIDSET].[SOURCECODE] = @SEGMENTSOURCECODE' + char(13) +
' and not exists(select * from [NONSEGMENTDONORS] where [' + @DONORMATCHFIELD + '] = [GIFTIDSET].[' + @DONORMATCHFIELD + '])' + char(13) +
' option (optimize for (@SEGMENTID unknown, @TESTSEGMENTID unknown));';
end
else --Consolidated List
begin
/* 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 = @WITHBLOCKSQL + ',' + char(13) +
'[LISTDONORS]([ID], [DONORID], [GIFTID], [SOURCECODEMAPID]) as' + char(13) +
'(' + char(13) +
' select distinct' + char(13) +
' [LISTMATCHBACK].[ID],' + char(13) +
' [LISTMATCHBACK].[DONORID],' + char(13) +
' [LISTMATCHBACK].[GIFTID],' + char(13) +
' (select [MKTSOURCECODEMAP].[ID]' + char(13) +
' from dbo.[MKTSOURCECODEMAP]' + char(13) +
' where [MKTSOURCECODEMAP].[SEGMENTATIONSEGMENTID] = @SEGMENTID' + char(13) +
' and [MKTSOURCECODEMAP].[SEGMENTATIONTESTSEGMENTID] ' + (case when @TESTSEGMENTID is null then 'is null' else '= @TESTSEGMENTID' end) + 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) +
'insert into #REVSEGTEMP ([REVENUEID], [SEGMENTID], [TESTSEGMENTID], [SOURCECODEMAPID])' + char(13) +
' select [GIFTIDSET].[ID], @SEGMENTID, @TESTSEGMENTID, [LISTDONORS].[SOURCECODEMAPID]' + char(13) +
' from dbo.[' + @DATATABLE + '] as [DONORS]' + char(13) +
' inner join [LISTDONORS] on ' + (case when @NEEDCAST = 1 then 'cast([LISTDONORS].[ID] as nvarchar(36))' else '[LISTDONORS].[ID]' end) + ' = [DONORS].[DONORID]' + char(13) +
' inner join dbo.' + @GIFTIDSETNAME + ' as [GIFTIDSET] on [GIFTIDSET].[ID] = [LISTDONORS].[GIFTID]' + char(13) +
' where not exists(select * from #REVSEGTEMP where [REVENUEID] = [GIFTIDSET].[ID])' + char(13) +
' and [DONORS].[DONORQUERYVIEWCATALOGID] <> @DONORQUERYVIEWID' + char(13) +
' and [DONORS].[SEGMENTID] = @SEGMENTID' + char(13) +
' and [DONORS].[TESTSEGMENTID] ' + (case when @TESTSEGMENTID is null then 'is null' else '= @TESTSEGMENTID' end) + char(13) +
' and [DONORS].[FINDERNUMBER] > 0' + char(13) +
char(13) +
' union all' + char(13) +
char(13) +
' select [GIFTIDSET].[ID], @SEGMENTID, @TESTSEGMENTID, @SOURCECODEMAPID' + char(13) +
' from dbo.' + @GIFTIDSETNAME + ' as [GIFTIDSET]' + char(13) +
' inner join [SEGMENTDONORS] on [SEGMENTDONORS].[DONORID] = ' + (case when @NEEDCAST = 1 then 'cast([GIFTIDSET].[DONORID] as varchar(36))' else '[GIFTIDSET].[DONORID]' end) + char(13) +
' where not exists(select * from #REVSEGTEMP where [REVENUEID] = [GIFTIDSET].[ID])' + char(13) +
' and (not exists(select * from [LISTDONORS]) or [SEGMENTDONORS].[DONORID] not in (select ' + (case when @NEEDCAST = 1 then 'cast([LISTDONORS].[DONORID] as nvarchar(36))' else '[LISTDONORS].[DONORID]' end) + ' from [LISTDONORS]))' + char(13) +
' option (optimize for (@SEGMENTID unknown, @TESTSEGMENTID unknown));';
if @ISFIRSTSEGMENTWITHTHISSOURCECODE = 1
--If we have the first segment in the mailing with this sourcecode (mailings could have duplicate sourcecodes), then...
-- * Count gift if source code matches, and...
-- * If the DONORID will not be matched to any other segment above or below this one...
set @SQL += char(13) + char(13) +
'declare @CONSOLIDATEDSOURCECODES table ([ID] uniqueidentifier not null primary key, [SOURCECODE] nvarchar(50) not null);' + char(13) +
'declare @CONSOLIDATEDQUERYVIEWS table ([ID] uniqueidentifier not null primary key);' + char(13) +
char(13) +
'insert into @CONSOLIDATEDSOURCECODES ([ID], [SOURCECODE])' + char(13) +
' select [ID], [SOURCECODE]' + char(13) +
' from dbo.[MKTSOURCECODEMAP]' + char(13) +
' where [SEGMENTATIONSEGMENTID] = @SEGMENTID' + char(13) +
' and [SEGMENTATIONTESTSEGMENTID] ' + (case when @TESTSEGMENTID is null then 'is null' else '= @TESTSEGMENTID' end) + ';' + char(13) +
char(13) +
'insert into @CONSOLIDATEDQUERYVIEWS ([ID])' + char(13) +
' select distinct [DONORQUERYVIEWCATALOGID]' + char(13) +
' from dbo.[' + @DATATABLE + ']' + char(13) +
' where [SEGMENTID] = @SEGMENTID' + char(13) +
' and [TESTSEGMENTID] ' + (case when @TESTSEGMENTID is null then 'is null' else '= @TESTSEGMENTID' end) + ';' + char(13) +
char(13) +
'with [NONSEGMENTDONORS] ([DONORID]) as' + char(13) +
'(' + char(13) +
' select isnull(' + (case when @NEEDCAST = 1 then 'cast([LISTDONORS].[DONORID] as nvarchar(36))' else '[LISTDONORS].[DONORID]' end) + ', [DONORS].[DONORID])' + char(13) +
' from dbo.[' + @DATATABLE + '] as [DONORS]' + char(13) +
' left join dbo.[' + @LISTMATCHBACKTABLE + '] as [LISTDONORS] on ' + (case when @NEEDCAST = 1 then 'cast([LISTDONORS].[ID] as nvarchar(36))' else '[LISTDONORS].[ID]' end) + ' = [DONORS].[DONORID] and [LISTDONORS].[SEGMENTATIONID] = @SEGMENTATIONID' + char(13) +
' where [DONORS].[DONORQUERYVIEWCATALOGID] in (select [ID] from @CONSOLIDATEDQUERYVIEWS)' + char(13) +
' and not ([DONORS].[SEGMENTID] = @SEGMENTID and [DONORS].[TESTSEGMENTID] ' + (case when @TESTSEGMENTID is null then 'is null' else '= @TESTSEGMENTID' end) + ')' + char(13) +
' and [DONORS].[FINDERNUMBER] > 0' + char(13) +
')' + char(13) +
'insert into #REVSEGTEMP ([REVENUEID], [SEGMENTID], [TESTSEGMENTID], [SOURCECODEMAPID])' + char(13) +
' select [GIFTIDSET].[ID], @SEGMENTID, @TESTSEGMENTID, [CONSOLSC].[ID]' + char(13) +
' from dbo.' + @GIFTIDSETNAME + ' as [GIFTIDSET]' + char(13) +
' inner join @CONSOLIDATEDSOURCECODES as [CONSOLSC] on [CONSOLSC].[SOURCECODE] = [GIFTIDSET].[SOURCECODE]' + char(13) +
' where not exists(select * from #REVSEGTEMP where [REVENUEID] = [GIFTIDSET].[ID])' + char(13) +
' and not exists(select * from [NONSEGMENTDONORS] where [DONORID] = ' + (case when @NEEDCAST = 1 then 'cast([GIFTIDSET].[DONORID] as nvarchar(36))' else '[GIFTIDSET].[DONORID]' end) + ')' + char(13) +
' option (optimize for (@SEGMENTID unknown, @TESTSEGMENTID unknown));';
end
set @PARAMDEF = '@SEGMENTATIONID uniqueidentifier, ' +
'@SEGMENTID uniqueidentifier, ' +
'@TESTSEGMENTID uniqueidentifier, ' +
'@SOURCECODEMAPID uniqueidentifier, ' +
'@DONORQUERYVIEWID uniqueidentifier, ' +
'@SEGMENTSOURCECODE nvarchar(50)';
exec sp_executesql @SQL, @PARAMDEF,
@SEGMENTATIONID = @SEGMENTATIONID,
@SEGMENTID = @SEGMENTID,
@TESTSEGMENTID = @TESTSEGMENTID,
@SOURCECODEMAPID = @SOURCECODEMAPID,
@DONORQUERYVIEWID = @DONORQUERYVIEWID,
@SEGMENTSOURCECODE = @SEGMENTSOURCECODE;
fetch next from SEGMENTCURSOR into @SEGMENTID, @TESTSEGMENTID;
end
close SEGMENTCURSOR;
deallocate SEGMENTCURSOR;
--For debug only...
--set @STATUS = 'Merging results into ' + @REVENUESEGMENTTABLE + '...';
--raiserror(@STATUS, 0, 0) with nowait;
--Now merge our temp table into the REVENUESEGMENT table...
-- * This will "update" the segment info for any existing revenue IDs that we calculated above (even if the revenue was previously for a different mailing).
-- * This will "insert" any new revenue IDs that don't already exist in the REVENUESEGMENT table.
-- * This will "delete" any leftover existing revenue IDs that were previously matched to this mailing.
set @SQL = 'merge into dbo.[' + @REVENUESEGMENTTABLE + '] t' + char(13) +
'using #REVSEGTEMP s on s.[REVENUEID] = t.[REVENUEID]' + char(13) +
'when matched and (s.[SEGMENTID] <> t.[SEGMENTID] or ((s.[TESTSEGMENTID] is null and t.[TESTSEGMENTID] is not null) or (s.[TESTSEGMENTID] is not null and t.[TESTSEGMENTID] is null) or s.[TESTSEGMENTID] <> t.[TESTSEGMENTID]) or ((s.[SOURCECODEMAPID] is null and t.[SOURCECODEMAPID] is not null) or (s.[SOURCECODEMAPID] is not null and t.[SOURCECODEMAPID] is null) or s.[SOURCECODEMAPID] <> t.[SOURCECODEMAPID])) then' + char(13) +
' update set [SEGMENTID] = s.[SEGMENTID], [TESTSEGMENTID] = s.[TESTSEGMENTID], [SOURCECODEMAPID] = s.[SOURCECODEMAPID]' + char(13) +
'when not matched then' + char(13) +
' insert ([REVENUEID], [SEGMENTID], [TESTSEGMENTID], [SOURCECODEMAPID])' + char(13) +
' values (s.[REVENUEID], s.[SEGMENTID], s.[TESTSEGMENTID], s.[SOURCECODEMAPID])' + char(13) +
'when not matched by source and t.[SEGMENTID] in (select [ID] from #MAILINGSEGMENTS) then' + char(13) +
' delete;';
exec (@SQL);
--Cleanup temp tables for the record source...
drop table #REVSEGTEMP;
fetch next from RECORDSOURCECURSOR into @RECORDSOURCEID, @GIFTIDSETNAME, @REVENUESEGMENTTABLE, @LISTMATCHBACKTABLE, @REVENUEDATATYPENAME;
end
close RECORDSOURCECURSOR;
deallocate RECORDSOURCECURSOR;
--Cleanup temp tables for the mailing...
drop table #MAILINGSEGMENTS;
if @SOURCECODEID is not null
drop table #MAILINGSOURCECODES;
end try
begin catch
exec dbo.[USP_RAISE_ERROR];
if object_id('tempdb..#REVSEGTEMP') is not null
drop table #REVSEGTEMP;
if object_id('tempdb..#MAILINGSEGMENTS') is not null
drop table #MAILINGSEGMENTS;
if object_id('tempdb..#MAILINGSOURCECODES') is not null
drop table #MAILINGSOURCECODES;
return 1;
end catch
return 0;