USP_MKTSOURCEANALYSISRULE_CACHEDATA
Saves the activated marketing effort's source analysis rule data.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SEGMENTATIONID | uniqueidentifier | IN | |
@ONLYCACHEDELTA | bit | IN | |
@INSERTSQL | nvarchar(max) | IN | |
@JOINSQL | nvarchar(max) | IN | |
@SELECTSQL | nvarchar(max) | IN | |
@WITHSQL | nvarchar(max) | IN | |
@RECORDSOURCEID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.[USP_MKTSOURCEANALYSISRULE_CACHEDATA]
(
@SEGMENTATIONID uniqueidentifier,
@ONLYCACHEDELTA bit = 1,
@INSERTSQL nvarchar(max),
@JOINSQL nvarchar(max),
@SELECTSQL nvarchar(max),
@WITHSQL nvarchar(max),
@RECORDSOURCEID uniqueidentifier
)
as
set nocount on;
declare @SOURCEANALYSISRULEDATATABLE nvarchar(128);
declare @DATATABLE nvarchar(128);
declare @SQL nvarchar(max);
begin try
--Create a temp table of segments for the record source...
create table #SEGMENTS ([SEGMENTID] uniqueidentifier not null, [TESTSEGMENTID] uniqueidentifier);
--Get all the segments and test segments for the record source...
insert into #SEGMENTS ([SEGMENTID], [TESTSEGMENTID])
select [MKTSEGMENTATIONSEGMENT].[ID], null
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
and [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 0
and [MKTSEGMENT].[SEGMENTTYPECODE] not in (2, 6, 7, 8) -- skip list segments, public media segments
and [MKTSEGMENT].[QUERYVIEWCATALOGID] = @RECORDSOURCEID
union all
select [MKTSEGMENTATIONSEGMENT].[ID], [MKTSEGMENTATIONTESTSEGMENT].[ID]
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 [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 0
and [MKTSEGMENT].[SEGMENTTYPECODE] not in (2, 6, 7, 8) -- skip list segments, public media segments
and [MKTSEGMENT].[QUERYVIEWCATALOGID] = @RECORDSOURCEID;
--Only insert source analysis data if we have house file or consolidated list segments...
if exists(select top 1 1 from #SEGMENTS)
begin
if isnull(@INSERTSQL, '') = ''
raiserror('The @INSERTSQL parameter is required.', 13, 1);
if isnull(@SELECTSQL, '') = ''
raiserror('The @SELECTSQL parameter is required.', 13, 1);
set @DATATABLE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME](@SEGMENTATIONID);
set @SOURCEANALYSISRULEDATATABLE = dbo.[UFN_MKTSOURCEANALYSISRULE_MAKETABLENAME](@RECORDSOURCEID);
/* Create or update the source analysis data table */
exec dbo.[USP_MKTSOURCEANALYSISRULE_CREATEDATATABLE] @RECORDSOURCEID;
/* Execute the SQL here, only once per record source in order to limit the number of times we have to hit the linked server constituent view */
/* now that SAR data can be cached before activation:
- only insert into the table those donors who are new since the data was last cached
(if SAR data is being re-cached, the data from the table will have been truncated before this)
- delete from the table those donors who are no longer in the mailing data
*/
set @SQL = 'create table #SEGMENTDONORS (' + char(13) +
' [DONORID] ' + dbo.[UFN_MKTRECORDSOURCE_GETDONORIDDATATYPE](@RECORDSOURCEID) + ' not null,' + char(13) +
' [SEGMENTID] uniqueidentifier not null,' + char(13) +
' [TESTSEGMENTID] uniqueidentifier,' + char(13) +
' [FINDERNUMBER] bigint not null' + char(13) +
');' + char(13) +
char(13) +
'create clustered index [IX_SEGMENTDONORS_DONORID] on #SEGMENTDONORS ([DONORID]);' + char(13) +
char(13) +
'--Get all the donor IDs for all the segments and test segments...' + char(13) +
'insert into #SEGMENTDONORS ([DONORID], [SEGMENTID], [TESTSEGMENTID], [FINDERNUMBER])' + char(13) +
' select distinct' + char(13) +
' [DONORS].[DONORID],' + char(13) +
' [SEGMENTS].[SEGMENTID],' + char(13) +
' [SEGMENTS].[TESTSEGMENTID],' + char(13) +
' [DONORS].[FINDERNUMBER]' + char(13) +
' from #SEGMENTS as [SEGMENTS]' + char(13) +
' inner join dbo.[' + @DATATABLE + '] as [DONORS] on [DONORS].[SEGMENTID] = [SEGMENTS].[SEGMENTID] and (([DONORS].[TESTSEGMENTID] is null and [SEGMENTS].[TESTSEGMENTID] is null) or [DONORS].[TESTSEGMENTID] = [SEGMENTS].[TESTSEGMENTID])' + char(13) +
' where [DONORS].[DONORQUERYVIEWCATALOGID] = @RECORDSOURCEID;' + char(13) +
char(13);
if @ONLYCACHEDELTA = 0
set @SQL += '--Clear out any pre-existing SAR data for this mailing...' + char(13) +
'delete from dbo.[' + @SOURCEANALYSISRULEDATATABLE + '] where [MAILINGID] = @SEGMENTATIONID;' + char(13) +
char(13);
else
set @SQL += '--Delete from the table those donors who are no longer in the mailing data...' + char(13) +
'delete from dbo.[' + @SOURCEANALYSISRULEDATATABLE + ']' + char(13) +
'from dbo.[' + @SOURCEANALYSISRULEDATATABLE + '] as [SAR]' + char(13) +
'where [SAR].[MAILINGID] = @SEGMENTATIONID' + char(13) +
'and not exists(select * from #SEGMENTDONORS as [DONORS] where [DONORS].[DONORID] = [SAR].[DONORID] and [DONORS].[FINDERNUMBER] = [SAR].[FINDERNUMBER]);' + char(13) +
char(13) +
'--For those donors who are still in the mailing, make sure they have the right SEGMENTID and TESTSEGMENTID...' + char(13) +
'update dbo.[' + @SOURCEANALYSISRULEDATATABLE + '] set' + char(13) +
' [SEGMENTID] = [DONORS].[SEGMENTID],' + char(13) +
' [TESTSEGMENTID] = [DONORS].[TESTSEGMENTID]' + char(13) +
'from dbo.[' + @SOURCEANALYSISRULEDATATABLE + '] as [SAR]' + char(13) +
'inner join #SEGMENTDONORS as [DONORS] on [DONORS].[DONORID] = [SAR].[DONORID] and [DONORS].[FINDERNUMBER] = [SAR].[FINDERNUMBER]' + char(13) +
'where [SAR].[MAILINGID] = @SEGMENTATIONID;' + char(13) +
char(13);
set @SQL += '--Insert into the source analysis table the data for each donor who isn''t already there...' + char(13) +
'with [DONORS] ([DONORID], [SEGMENTID], [TESTSEGMENTID], [FINDERNUMBER]) as' + char(13) +
'(' + char(13) +
' select' + char(13) +
' [DONORID],' + char(13) +
' [SEGMENTID],' + char(13) +
' [TESTSEGMENTID],' + char(13) +
' [FINDERNUMBER]' + char(13) +
' from #SEGMENTDONORS' + char(13) +
')' + isnull(@WITHSQL, '') +
char(13) +
@INSERTSQL +
@SELECTSQL +
' from [DONORS]' + char(13);
if @ONLYCACHEDELTA = 0
set @SQL += isnull(@JOINSQL, '');
else
set @SQL += ' left outer join dbo.[' + @SOURCEANALYSISRULEDATATABLE + '] as [EXISTING] on ([EXISTING].[MAILINGID] = @SEGMENTATIONID and [EXISTING].[DONORID] = [DONORS].[DONORID] and [EXISTING].[FINDERNUMBER] = [DONORS].[FINDERNUMBER])' + char(13) +
isnull(@JOINSQL, '') +
' --Only insert into the table those donors who are new since the data was last cached...' + char(13) +
' where [EXISTING].[DONORID] is null;';
set @SQL += char(13) + char(13) +
'drop table #SEGMENTDONORS;'
exec sp_executesql @SQL, N'@SEGMENTATIONID uniqueidentifier, @RECORDSOURCEID uniqueidentifier', @SEGMENTATIONID = @SEGMENTATIONID, @RECORDSOURCEID = @RECORDSOURCEID;
end
--Drop the segment temp table...
drop table #SEGMENTS;
end try
begin catch
exec dbo.[USP_RAISE_ERROR];
return 1;
end catch
return 0;