USP_MKTSEGMENTATION_MATCHBACK
Matches donor ids in a marketing effort with their list record if the record was originally from a list.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SEGMENTATIONID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.[USP_MKTSEGMENTATION_MATCHBACK]
(
@SEGMENTATIONID uniqueidentifier
)
as
set nocount on;
declare @IMPORTEDLISTCURSOR cursor;
declare @SEGMENTID uniqueidentifier;
declare @TESTSEGMENTID uniqueidentifier;
declare @SEGMENTSOURCECODE nvarchar(255);
declare @LISTID uniqueidentifier;
declare @LISTMATCHBACKTABLE nvarchar(128);
declare @CONSTITUENTSEGMENTTABLE nvarchar(128);
declare @RECORDSOURCEID uniqueidentifier;
declare @GIFTVIEWNAME nvarchar(255);
declare @GIFTVIEWDONORIDFIELD nvarchar(255);
declare @GIFTVIEWAPPEALIDFIELD nvarchar(255);
declare @GIFTVIEWAPPEALSYSTEMIDFIELD nvarchar(255);
declare @GIFTVIEWMAILINGIDFIELD nvarchar(255);
declare @GIFTVIEWSOURCECODEFIELD nvarchar(255);
declare @GIFTVIEWFINDERNUMBERFIELD nvarchar(255);
declare @GIFTVIEWPRIMARYKEYFIELD nvarchar(255);
declare @APPEALID nvarchar(100);
declare @APPEALSYSTEMID nvarchar(36);
declare @SQL nvarchar(max);
declare @PARAMDEF nvarchar(255);
declare @DATATABLE nvarchar(128);
declare @MAILINGID nvarchar(36);
declare @TEMPTABLENAME nvarchar(128);
declare @ISBBEC bit;
declare @ACTIVE bit;
declare @HASVENDORMANAGEDSEGMENTS bit;
declare @FINDERNUMBER bigint;
begin try
set @ISBBEC = (case when dbo.[UFN_INSTALLEDPRODUCTS_PRODUCTIS]('BB9873D7-F1ED-430A-8AB4-F09F47056538') = 0 then 1 else 0 end);
select
@MAILINGID = (case when @ISBBEC = 1 then convert(nvarchar(36), [ID]) else convert(nvarchar(36), [IDINTEGER]) end),
@DATATABLE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME]([ID]),
@ACTIVE = [ACTIVE]
from dbo.[MKTSEGMENTATION]
where [ID] = @SEGMENTATIONID;
--Always start from scratch so we get the most accurate gift information. If the appealID changed
--on a gift, then that needs to be reflected here by removing the matchback from this mailing.
exec dbo.[USP_MKTSEGMENTATION_MATCHBACKDELETE] @SEGMENTATIONID, 1;
/******************************************************************************/
/* Imported list matchback */
/******************************************************************************/
--Create a table of all imported lists in the mailing...
create table #IMPORTEDLISTS (
[QUERYVIEWCATALOGID] uniqueidentifier not null,
[RECORDSOURCEID] uniqueidentifier not null,
constraint [PK_IMPORTEDLISTS] primary key clustered ([QUERYVIEWCATALOGID] asc)
);
set @SQL = 'insert into #IMPORTEDLISTS ([QUERYVIEWCATALOGID], [RECORDSOURCEID])' + char(13) +
' select distinct' + char(13) +
' [MKTSEGMENTLIST].[QUERYVIEWCATALOGID],' + char(13) +
' [MKTLIST].[RECORDSOURCEID]' + char(13) +
' from dbo.[' + @DATATABLE + '] as [DONORS]' + char(13) +
' inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[QUERYVIEWCATALOGID] = [DONORS].[DONORQUERYVIEWCATALOGID]' + char(13) +
' inner join dbo.[MKTLIST] on [MKTLIST].[ID] = [MKTSEGMENTLIST].[LISTID]';
exec (@SQL);
set @PARAMDEF = '@SEGMENTATIONID uniqueidentifier, @RECORDSOURCEID uniqueidentifier, @APPEALSYSTEMID nvarchar(36), @APPEALID nvarchar(100)';
--Loop through each record source in the mailing...
declare RECORDSOURCECURSOR cursor local fast_forward for
select distinct [RECORDSOURCEID]
from #IMPORTEDLISTS;
open RECORDSOURCECURSOR;
fetch next from RECORDSOURCECURSOR into @RECORDSOURCEID;
while (@@FETCH_STATUS = 0)
begin
--Gather some info about the gift view to use...
select distinct
@GIFTVIEWNAME = [QUERYVIEWCATALOG].[OBJECTNAME],
@GIFTVIEWPRIMARYKEYFIELD = [QUERYVIEWCATALOG].[PRIMARYKEYFIELD],
@GIFTVIEWDONORIDFIELD = [MKTGIFTRECORDSOURCE].[DONORIDFIELD],
@GIFTVIEWFINDERNUMBERFIELD = [MKTGIFTRECORDSOURCE].[FINDERNUMBERFIELD],
@GIFTVIEWAPPEALIDFIELD = [MKTGIFTRECORDSOURCE].[APPEALIDFIELD],
@GIFTVIEWAPPEALSYSTEMIDFIELD = [MKTGIFTRECORDSOURCE].[APPEALSYSTEMIDFIELD],
@APPEALID = isnull([MKTSEGMENTATIONACTIVATE].[APPEALID],''),
@APPEALSYSTEMID = isnull([MKTSEGMENTATIONACTIVATE].[APPEALSYSTEMID],''),
@LISTMATCHBACKTABLE = dbo.[UFN_MKTRECORDSOURCE_MAKEMATCHBACKTABLENAME]([MKTGIFTRECORDSOURCE].[ID])
from dbo.[MKTGIFTRECORDSOURCE]
inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTGIFTRECORDSOURCE].[QUERYVIEWCATALOGID]
inner join dbo.[MKTSEGMENTATIONACTIVATE] on [MKTSEGMENTATIONACTIVATE].[SEGMENTATIONID] = @SEGMENTATIONID and [MKTSEGMENTATIONACTIVATE].[RECORDSOURCEID] = [MKTGIFTRECORDSOURCE].[ID]
where [MKTGIFTRECORDSOURCE].[ID] = @RECORDSOURCEID;
--Update any gifts that may already be matched back for a different mailing, because they would not have gotten deleted above...
--Insert matched records into the list matchback table...
--Delete any old records that were previously matched to this mailing but are not anymore...
set @SQL = 'merge into dbo.[' + @LISTMATCHBACKTABLE + '] t' + char(13) +
'using (' + char(13) +
' select' + char(13) +
' [MKTSEGMENTLISTDATA].[ID],' + char(13) +
' [GIFTS].[' + @GIFTVIEWDONORIDFIELD + '] as [DONORID],' + char(13) +
' [GIFTS].[' + @GIFTVIEWPRIMARYKEYFIELD + '] as [GIFTID]' + char(13) +
' from dbo.[' + @GIFTVIEWNAME + '] as [GIFTS]' + char(13) +
' inner join dbo.[' + @DATATABLE + '] as [DONORS] on [DONORS].[FINDERNUMBER] = [GIFTS].[' + @GIFTVIEWFINDERNUMBERFIELD + ']' + char(13) +
' inner join dbo.[MKTSEGMENTLISTDATA] on [MKTSEGMENTLISTDATA].[ID] = [DONORS].[DONORID]' + char(13) +
' where [DONORS].[DONORQUERYVIEWCATALOGID] in (select [QUERYVIEWCATALOGID] from #IMPORTEDLISTS where [RECORDSOURCEID] = @RECORDSOURCEID)' + char(13) +
' and [GIFTS].' + (case when len(@APPEALSYSTEMID) > 0 then '[' + @GIFTVIEWAPPEALSYSTEMIDFIELD + '] = @APPEALSYSTEMID' else '[' + @GIFTVIEWAPPEALIDFIELD + '] = @APPEALID' end) + char(13) +
') s on s.[GIFTID] = t.[GIFTID]' + char(13) +
'when matched and (s.[ID] <> t.[ID] or s.[DONORID] <> t.[DONORID] or t.[SEGMENTATIONID] <> @SEGMENTATIONID) then' + char(13) +
' update set [ID] = s.[ID], [DONORID] = s.[DONORID], [SEGMENTATIONID] = @SEGMENTATIONID' + char(13) +
'when not matched then' + char(13) +
' insert ([ID], [DONORID], [GIFTID], [SEGMENTATIONID])' + char(13) +
' values (s.[ID], s.[DONORID], s.[GIFTID], @SEGMENTATIONID)' + char(13) +
'when not matched by source and t.[SEGMENTATIONID] = @SEGMENTATIONID then' + char(13) +
' delete;';
exec sp_executesql @SQL, @PARAMDEF,
@SEGMENTATIONID = @SEGMENTATIONID,
@RECORDSOURCEID = @RECORDSOURCEID,
@APPEALSYSTEMID = @APPEALSYSTEMID,
@APPEALID = @APPEALID;
fetch next from RECORDSOURCECURSOR into @RECORDSOURCEID;
end;
close RECORDSOURCECURSOR;
deallocate RECORDSOURCECURSOR;
--Clean up the temp table...
drop table #IMPORTEDLISTS;
/******************************************************************************/
/* Vendor managed list matchback */
/******************************************************************************/
set @HASVENDORMANAGEDSEGMENTS = (case when exists(
select top 1 1
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
left join dbo.[MKTSEGMENTATIONSEGMENTLIST] on [MKTSEGMENTATIONSEGMENTLIST].[ID] = [MKTSEGMENTATIONSEGMENT].[ID]
inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = (case when @ACTIVE = 0 then [MKTSEGMENT].[CURRENTSEGMENTLISTID] else [MKTSEGMENTATIONSEGMENTLIST].[SEGMENTLISTID] end)
where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
and [MKTSEGMENTLIST].[TYPECODE] = 1)
then 1 else 0 end);
if @HASVENDORMANAGEDSEGMENTS = 1
begin
--Loop through each vendor managed segment/test segment in the mailing and insert donor matchback info...
declare VENDORMANAGEDSEGMENTCURSOR cursor local fast_forward for
select
[TEMP].[ID],
[TEMP].[TESTID],
dbo.[UFN_MKTSOURCECODE_BUILDCODE](isnull([TEMP].[TESTID], [TEMP].[ID]), default, default),
[MKTLIST].[ID],
[MKTLIST].[RECORDSOURCEID]
from (
select [MKTSEGMENTATIONSEGMENT].[ID], [MKTSEGMENTLIST].[LISTID], [MKTSEGMENTATIONSEGMENT].[SEQUENCE], null as [TESTID], null as [TESTSEQUENCE]
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
left join dbo.[MKTSEGMENTATIONSEGMENTLIST] on [MKTSEGMENTATIONSEGMENTLIST].[ID] = [MKTSEGMENTATIONSEGMENT].[ID]
inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = (case when @ACTIVE = 0 then [MKTSEGMENT].[CURRENTSEGMENTLISTID] else [MKTSEGMENTATIONSEGMENTLIST].[SEGMENTLISTID] end)
where [SEGMENTATIONID] = @SEGMENTATIONID
and [MKTSEGMENTLIST].[TYPECODE] = 1
union
select [SEG].[ID], [MKTSEGMENTLIST].[LISTID], [SEG].[SEQUENCE], [TESTSEG].[ID] as [TESTID], [TESTSEG].[SEQUENCE] as [TESTSEQUENCE]
from [MKTSEGMENTATIONSEGMENT] as [SEG]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [SEG].[SEGMENTID]
left join dbo.[MKTSEGMENTATIONSEGMENTLIST] on [MKTSEGMENTATIONSEGMENTLIST].[ID] = [SEG].[ID]
inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = (case when @ACTIVE = 0 then [MKTSEGMENT].[CURRENTSEGMENTLISTID] else [MKTSEGMENTATIONSEGMENTLIST].[SEGMENTLISTID] end)
left join [MKTSEGMENTATIONTESTSEGMENT] as [TESTSEG] on [TESTSEG].[SEGMENTID] = [SEG].[ID]
where [SEG].[SEGMENTATIONID] = @SEGMENTATIONID
and [MKTSEGMENTLIST].[TYPECODE] = 1
) as [TEMP]
inner join dbo.[MKTLIST] on [MKTLIST].[ID] = [TEMP].[LISTID]
group by [TEMP].[ID], [TEMP].[LISTID], [TEMP].[TESTID], [TEMP].[SEQUENCE], [TEMP].[TESTSEQUENCE], [MKTLIST].[ID], [MKTLIST].[RECORDSOURCEID]
order by [TEMP].[SEQUENCE], [TEMP].[TESTSEQUENCE];
open VENDORMANAGEDSEGMENTCURSOR;
fetch next from VENDORMANAGEDSEGMENTCURSOR into @SEGMENTID, @TESTSEGMENTID, @SEGMENTSOURCECODE, @LISTID, @RECORDSOURCEID;
while (@@FETCH_STATUS = 0)
begin
--Gather some info about the gift view to use...
select distinct
@GIFTVIEWNAME = [QUERYVIEWCATALOG].[OBJECTNAME],
@GIFTVIEWPRIMARYKEYFIELD = [QUERYVIEWCATALOG].[PRIMARYKEYFIELD],
@GIFTVIEWDONORIDFIELD = [MKTGIFTRECORDSOURCE].[DONORIDFIELD],
@GIFTVIEWAPPEALIDFIELD = [MKTGIFTRECORDSOURCE].[APPEALIDFIELD],
@GIFTVIEWAPPEALSYSTEMIDFIELD = [MKTGIFTRECORDSOURCE].[APPEALSYSTEMIDFIELD],
@GIFTVIEWMAILINGIDFIELD = [MKTGIFTRECORDSOURCE].[MAILINGIDFIELD],
@GIFTVIEWSOURCECODEFIELD = [MKTGIFTRECORDSOURCE].[SOURCECODEFIELD],
@APPEALID = isnull([MKTSEGMENTATIONACTIVATE].[APPEALID],''),
@APPEALSYSTEMID = isnull([MKTSEGMENTATIONACTIVATE].[APPEALSYSTEMID],''),
@LISTMATCHBACKTABLE = dbo.[UFN_MKTRECORDSOURCE_MAKEMATCHBACKTABLENAME]([MKTGIFTRECORDSOURCE].[ID]),
@CONSTITUENTSEGMENTTABLE = dbo.[UFN_CONSTITUENTSEGMENT_MAKETABLENAME]([MKTGIFTRECORDSOURCE].[ID])
from dbo.[MKTGIFTRECORDSOURCE]
inner join dbo.[MKTSEGMENTATIONACTIVATE] on [MKTSEGMENTATIONACTIVATE].[SEGMENTATIONID] = @SEGMENTATIONID and [MKTSEGMENTATIONACTIVATE].[RECORDSOURCEID] = [MKTGIFTRECORDSOURCE].[ID]
inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTGIFTRECORDSOURCE].[QUERYVIEWCATALOGID]
where [MKTGIFTRECORDSOURCE].[ID] = @RECORDSOURCEID;
--Create a global temp table because we need to use it in the dynamic sql below...
set @TEMPTABLENAME = '##TEMP_' + replace(cast(newid() as nvarchar(36)), '-', '_');
--Select the list donor ID and the source system donor ID into a temp table...
set @SQL = 'select' + char(13) +
' newid() as [ID],' + char(13) +
' [' + @GIFTVIEWDONORIDFIELD + '] as [DONORID],' + char(13) +
' [' + @GIFTVIEWPRIMARYKEYFIELD + '] as [GIFTID]' + char(13) +
'into dbo.[' + @TEMPTABLENAME + ']' + char(13) +
'from dbo.[' + @GIFTVIEWNAME + ']' + char(13) +
'where ' + (case when len(@APPEALSYSTEMID) > 0
then '[' + @GIFTVIEWAPPEALSYSTEMIDFIELD + '] = @APPEALSYSTEMID'
else '[' + @GIFTVIEWAPPEALIDFIELD + '] = @APPEALID'
end) + char(13) +
'and [' + @GIFTVIEWMAILINGIDFIELD + '] = @MAILINGID' + char(13) +
'and [' + @GIFTVIEWSOURCECODEFIELD + '] = @SEGMENTSOURCECODE';
exec sp_executesql @SQL, N'@APPEALSYSTEMID nvarchar(36), @APPEALID nvarchar(100), @MAILINGID nvarchar(36), @SEGMENTSOURCECODE nvarchar(255)', @APPEALSYSTEMID = @APPEALSYSTEMID, @APPEALID = @APPEALID, @MAILINGID = @MAILINGID, @SEGMENTSOURCECODE = @SEGMENTSOURCECODE;
--Update the temp table so that donors that gave multiple gifts will have the same ID...
set @SQL = 'update dbo.[' + @TEMPTABLENAME + '] set' + char(13) +
' [ID] = (select top 1 [T1].[ID] from dbo.[' + @TEMPTABLENAME + '] as [T1] where [T1].[DONORID] = [' + @TEMPTABLENAME + '].[DONORID])';
exec (@SQL);
--Remove any rows from the CONSTITUENTSEGMENT table that may already be matched back for a different mailing, because they would not have gotten deleted above.
--If we don't do this here, then we will end up with orphaned rows in the CONSTITUENTSEGMENT table until the other mailing is refreshed.
set @SQL = 'delete from dbo.[' + @CONSTITUENTSEGMENTTABLE + ']' + char(13) +
'from dbo.[' + @CONSTITUENTSEGMENTTABLE + '] as [CS]' + char(13) +
'inner join dbo.[' + @LISTMATCHBACKTABLE + '] as [LISTDONORS] on [LISTDONORS].[SEGMENTATIONID] = @SEGMENTATIONID and [LISTDONORS].[DONORID] = [CS].[CONSTITUENTID]' + char(13) +
'inner join dbo.[' + @TEMPTABLENAME + '] as [TEMP] on [TEMP].[GIFTID] = [LISTDONORS].[GIFTID]' + char(13) +
'where [CS].[FINDERNUMBER] = 0';
exec sp_executesql @SQL, N'@SEGMENTATIONID uniqueidentifier', @SEGMENTATIONID = @SEGMENTATIONID;
--Update any gifts that may already be matched back for a different mailing, because they would not have gotten deleted above...
--Insert matched records into the list matchback table...
--Delete any old records that were previously matched to this mailing but are not anymore...
set @SQL = 'merge into dbo.[' + @LISTMATCHBACKTABLE + '] t' + char(13) +
'using dbo.[' + @TEMPTABLENAME + '] s on s.[GIFTID] = t.[GIFTID]' + char(13) +
'when matched and (s.[ID] <> t.[ID] or s.[DONORID] <> t.[DONORID] or t.[SEGMENTATIONID] <> @SEGMENTATIONID) then' + char(13) +
' update set [ID] = s.[ID], [DONORID] = s.[DONORID], [SEGMENTATIONID] = @SEGMENTATIONID' + char(13) +
'when not matched then' + char(13) +
' insert ([ID], [DONORID], [GIFTID], [SEGMENTATIONID])' + char(13) +
' values (s.[ID], s.[DONORID], s.[GIFTID], @SEGMENTATIONID);';
exec sp_executesql @SQL, N'@SEGMENTATIONID uniqueidentifier', @SEGMENTATIONID = @SEGMENTATIONID;
--Get smallest finder number to count back from
set @SQL = 'select @FINDERNUMBER = isnull(min([FINDERNUMBER]),0) from dbo.[' + @DATATABLE + '];';
exec sp_executesql @SQL, N'@FINDERNUMBER bigint output', @FINDERNUMBER = @FINDERNUMBER output;
if @FINDERNUMBER > 0
set @FINDERNUMBER = 0;
--Insert the donors into the mailing activated data table...
set @SQL = 'insert into dbo.[' + @DATATABLE + '] ([FINDERNUMBER], [SEGMENTID], [TESTSEGMENTID], [DONORID], [DONORQUERYVIEWCATALOGID], [SOURCECODE], [ASKLADDERID]' + (case when @ISBBEC = 1 then ', [CONSTITUENTAPPEALID])' else ')' end) + char(13) +
' select' + char(13) +
' @FINDERNUMBER - row_number() over(order by [TEMP].[ID]),' + char(13) +
' @SEGMENTID,' + char(13) +
' ' + (case when @TESTSEGMENTID is null then 'null' else '@TESTSEGMENTID' end) + ',' + char(13) +
' [TEMP].[ID],' + char(13) +
' null,' + char(13) +
' @SEGMENTSOURCECODE,' + char(13) +
' (select [ASKLADDERID] from dbo.[MKTSEGMENTATIONSEGMENT] where [ID] = @SEGMENTID)';
if @ISBBEC = 1
set @SQL = @SQL + ',' + char(13) +
' (select top 1 [ID]' + char(13) +
' from dbo.[CONSTITUENTAPPEAL]' + char(13) +
' where [CONSTITUENTID] = [TEMP].[DONORID]' + char(13) +
' and [MKTSEGMENTATIONSEGMENTID] = @SEGMENTID' + char(13) +
' and [MKTSEGMENTATIONTESTSEGMENTID] ' + (case when @TESTSEGMENTID is null then 'is null' else '= @TESTSEGMENTID' end) + char(13) +
' and ([FINDERNUMBER] = 0' + char(13) +
' or [FINDERNUMBER] = (select min([FINDERNUMBER])' + char(13) +
' from dbo.[CONSTITUENTAPPEAL]' + char(13) +
' where [CONSTITUENTID] = [TEMP].[DONORID]' + char(13) +
' and [MKTSEGMENTATIONSEGMENTID] = @SEGMENTID' + char(13) +
' and [MKTSEGMENTATIONTESTSEGMENTID] ' + (case when @TESTSEGMENTID is null then 'is null' else '= @TESTSEGMENTID' end) + ')))';
set @SQL = @SQL + char(13) + ' from (select distinct [ID], [DONORID] from dbo.[' + @TEMPTABLENAME + ']) as [TEMP]';
exec sp_executesql @SQL, N'@FINDERNUMBER bigint, @SEGMENTID uniqueidentifier, @TESTSEGMENTID uniqueidentifier, @SEGMENTSOURCECODE nvarchar(255)', @FINDERNUMBER = @FINDERNUMBER, @SEGMENTID = @SEGMENTID, @TESTSEGMENTID = @TESTSEGMENTID, @SEGMENTSOURCECODE = @SEGMENTSOURCECODE;
--Drop the global temp table...
set @SQL = 'drop table dbo.[' + @TEMPTABLENAME + ']';
exec (@SQL);
fetch next from VENDORMANAGEDSEGMENTCURSOR into @SEGMENTID, @TESTSEGMENTID, @SEGMENTSOURCECODE, @LISTID, @RECORDSOURCEID;
end
close VENDORMANAGEDSEGMENTCURSOR;
deallocate VENDORMANAGEDSEGMENTCURSOR;
end
--Rebuild all the indexes on the mailing activated data table to clean up fragmentation...
exec dbo.[USP_MKTCOMMON_REBUILDINDEX] @DATATABLE, null, 100, 1;
end try
begin catch
exec dbo.USP_RAISE_ERROR;
return 1;
end catch
return 0;