USP_MKTSEGMENTATIONPASSIVE_MATCHBACK
Creates marketing effort donor records for donors to public media marketing efforts.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SEGMENTATIONID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.[USP_MKTSEGMENTATIONPASSIVE_MATCHBACK]
(
@SEGMENTATIONID uniqueidentifier
)
as
set nocount on;
declare @MAILINGTYPECODE tinyint;
declare @SEGMENTID uniqueidentifier;
declare @SEGMENTSOURCECODE nvarchar(255);
declare @MATCHBACKTABLENAME 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 @DATATABLENAME nvarchar(128);
declare @MAILINGID nvarchar(36);
declare @TEMPTABLENAME nvarchar(128);
declare @ISBBEC bit;
declare @ACTIVE 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
@MAILINGTYPECODE = [MAILINGTYPECODE],
@MAILINGID = (case when @ISBBEC = 1 then convert(nvarchar(36), [ID]) else convert(nvarchar(36), [IDINTEGER]) end),
@DATATABLENAME = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME]([ID]),
@ACTIVE = [ACTIVE]
from dbo.[MKTSEGMENTATION]
where [ID] = @SEGMENTATIONID;
if @MAILINGTYPECODE <> 4 raiserror('Invalid marketing effort type.', 13, 1);
-- 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, so the matchback is removed from this mailing
exec dbo.[USP_MKTSEGMENTATION_MATCHBACKDELETE] @SEGMENTATIONID, 1;
-- loop through each segment in the mailing and insert donor matchback info
declare SEGMENTCURSOR cursor local fast_forward for
select
[MKTSEGMENTATIONSEGMENT].[ID],
dbo.[UFN_MKTSOURCECODE_BUILDCODE]([MKTSEGMENTATIONSEGMENT].[ID], default, default),
[MKTSEGMENT].[QUERYVIEWCATALOGID]
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
where [SEGMENTATIONID] = @SEGMENTATIONID;
open SEGMENTCURSOR;
fetch next from SEGMENTCURSOR into @SEGMENTID, @SEGMENTSOURCECODE, @RECORDSOURCEID;
while (@@FETCH_STATUS = 0)
begin
-- gather some info about the gift view we'll be using
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],''),
@MATCHBACKTABLENAME = dbo.[UFN_MKTRECORDSOURCE_MAKEMATCHBACKTABLENAME]([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 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);
--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 matchback table...
--Delete any old records that were previously matched to this mailing but are not anymore...
set @SQL = 'merge into dbo.[' + @MATCHBACKTABLENAME + '] 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.[' + @DATATABLENAME + '];';
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.[' + @DATATABLENAME + '] ([FINDERNUMBER], [SEGMENTID], [DONORID], [DONORQUERYVIEWCATALOGID], [SOURCECODE]' + (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) +
' [TEMP].[ID],' + char(13) +
' null,' + char(13) +
' @SEGMENTSOURCECODE';
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] is null' + 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] is null)))';
set @SQL = @SQL + char(13) + ' from (select distinct [ID], [DONORID] from dbo.[' + @TEMPTABLENAME + ']) as [TEMP]';
exec sp_executesql @SQL, N'@FINDERNUMBER bigint, @SEGMENTID uniqueidentifier, @SEGMENTSOURCECODE nvarchar(255)', @FINDERNUMBER = @FINDERNUMBER, @SEGMENTID = @SEGMENTID, @SEGMENTSOURCECODE = @SEGMENTSOURCECODE;
-- drop the global temp table
set @SQL = 'drop table dbo.[' + @TEMPTABLENAME + ']';
exec (@SQL);
fetch next from SEGMENTCURSOR into @SEGMENTID, @SEGMENTSOURCECODE, @RECORDSOURCEID;
end
close SEGMENTCURSOR;
deallocate SEGMENTCURSOR;
-- rebuild all the indexes on the mailing activated data table to clean up fragmentation
exec dbo.[USP_MKTCOMMON_REBUILDINDEX] @DATATABLENAME, null, 100, 1;
end try
begin catch
exec dbo.[USP_RAISE_ERROR];
return 1;
end catch
return 0;