USP_MKTSEGMENTATIONACTIVATE_ACTIVATESEGMENT
Activates a segment by inserting the donor IDs into the marketing effort data table.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SEGMENTID | uniqueidentifier | IN | |
@TESTSEGMENTID | uniqueidentifier | IN | |
@MAXROWS | int | IN | |
@USEMAXROWS | bit | IN |
Definition
Copy
CREATE procedure dbo.[USP_MKTSEGMENTATIONACTIVATE_ACTIVATESEGMENT]
(
@SEGMENTID uniqueidentifier,
@TESTSEGMENTID uniqueidentifier = null,
@MAXROWS int = 0,
@USEMAXROWS bit = 1
)
as
set nocount on;
declare @SEGMENTATIONID uniqueidentifier;
declare @MAILINGTYPECODE tinyint;
declare @SEGMENTATIONISHISTORICAL bit;
declare @ISACTIVATING bit;
declare @DATATABLE nvarchar(128);
declare @INDEXNAME nvarchar(128);
declare @INSERTSQL nvarchar(max);
declare @SQL nvarchar(max);
declare @USETOP bit;
declare @USENTH bit;
declare @USERANDOM bit;
declare @SEGMENTRECORDSOURCEID uniqueidentifier;
declare @SEGMENTRECORDTYPEID uniqueidentifier;
declare @SEGMENTRECORDTYPE tinyint;
declare @CONSOLIDATEDVIEWNAME nvarchar(128);
declare @TEMPSEGMENTTABLENAME nvarchar(128);
declare @TEMPNTHTABLENAME nvarchar(128);
declare @RECORDCOUNT int;
declare @NTHRECORD decimal(30,20);
declare @IDFORBUILDSOURCECODE uniqueidentifier;
declare @SOURCEQUERYVIEWID uniqueidentifier;
declare @SOURCECODE nvarchar(50);
declare @SAMPLESIZEEXCLUDEREMAINDER bit;
declare @NEEDCAST bit;
declare @LISTNAME nvarchar(50);
declare @LISTTABLENAME nvarchar(128);
declare @GIFTVIEWNAME nvarchar(128);
declare @GIFTVIEWPRIMARYKEYFIELD nvarchar(255);
declare @GIFTVIEWDONORIDFIELD nvarchar(255);
declare @MKTSEGMENTID uniqueidentifier;
declare @MEMBERVIEWNAME nvarchar(128);
declare @MEMBERVIEWPRIMARYKEYFIELD nvarchar(255);
declare @MEMBERVIEWDONORIDFIELD nvarchar(255);
declare @SPONSORVIEWNAME nvarchar(128);
declare @SPONSORVIEWPRIMARYKEYFIELD nvarchar(255);
declare @SPONSORVIEWDONORIDFIELD nvarchar(255);
declare @DATATYPE nvarchar(128);
declare @CONSTITUENTFILEIMPORTUSED bit;
declare @ISBBEC bit;
begin try
if @MAXROWS is null or @MAXROWS < 0
set @MAXROWS = 0;
if @TESTSEGMENTID is null
--Grab info from the segment
select distinct
@SEGMENTATIONID = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID],
@MAILINGTYPECODE = [MKTSEGMENTATION].[MAILINGTYPECODE],
@SEGMENTATIONISHISTORICAL = [MKTSEGMENTATION].[ISHISTORICAL],
@ISACTIVATING = dbo.[UFN_MKTSEGMENTATION_ISACTIVATING]([MKTSEGMENTATION].[ID]),
@USENTH = (case when [MKTSEGMENTATIONSEGMENT].[SAMPLESIZEMETHODCODE] = 0 and not ([MKTSEGMENTATIONSEGMENT].[SAMPLESIZETYPECODE] = 0 and [MKTSEGMENTATIONSEGMENT].[SAMPLESIZE] = 100) then 1 else 0 end),
@USERANDOM = (case when [MKTSEGMENTATIONSEGMENT].[SAMPLESIZEMETHODCODE] = 1 and not ([MKTSEGMENTATIONSEGMENT].[SAMPLESIZETYPECODE] = 0 and [MKTSEGMENTATIONSEGMENT].[SAMPLESIZE] = 100) then 1 else 0 end),
@USETOP = (case when [MKTSEGMENTATIONSEGMENT].[SAMPLESIZEMETHODCODE] = 2 and not ([MKTSEGMENTATIONSEGMENT].[SAMPLESIZETYPECODE] = 0 and [MKTSEGMENTATIONSEGMENT].[SAMPLESIZE] = 100) then 1 else 0 end),
@SEGMENTRECORDSOURCEID = [MKTSEGMENT].[QUERYVIEWCATALOGID],
@SEGMENTRECORDTYPEID = [IDSETREGISTER].[RECORDTYPEID],
@SEGMENTRECORDTYPE = dbo.[UFN_MKTSEGMENT_GETMARKETINGRECORDTYPE]([MKTSEGMENT].[ID]),
@IDFORBUILDSOURCECODE = @SEGMENTID,
@SAMPLESIZEEXCLUDEREMAINDER = [MKTSEGMENTATIONSEGMENT].[SAMPLESIZEEXCLUDEREMAINDER],
@MKTSEGMENTID = [MKTSEGMENT].[ID]
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
left join dbo.[MKTSEGMENTSELECTION] on [MKTSEGMENTSELECTION].[SEGMENTID] = [MKTSEGMENT].[ID]
inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENTSELECTION].[SELECTIONID] or [IDSETREGISTER].[ID] = [MKTSEGMENT].[IDSETREGISTERID]
where [MKTSEGMENTATIONSEGMENT].[ID] = @SEGMENTID;
else
--Grab info from the test segment
select distinct
@SEGMENTATIONID = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID],
@MAILINGTYPECODE = [MKTSEGMENTATION].[MAILINGTYPECODE],
@SEGMENTATIONISHISTORICAL = [MKTSEGMENTATION].[ISHISTORICAL],
@ISACTIVATING = dbo.[UFN_MKTSEGMENTATION_ISACTIVATING]([MKTSEGMENTATION].[ID]),
@USENTH = (case when [MKTSEGMENTATIONTESTSEGMENT].[SAMPLESIZEMETHODCODE] = 0 then 1 else 0 end),
@USERANDOM = (case when [MKTSEGMENTATIONTESTSEGMENT].[SAMPLESIZEMETHODCODE] = 1 then 1 else 0 end),
@USETOP = (case when [MKTSEGMENTATIONTESTSEGMENT].[SAMPLESIZEMETHODCODE] = 2 then 1 else 0 end),
@SEGMENTRECORDSOURCEID = [MKTSEGMENT].[QUERYVIEWCATALOGID],
@SEGMENTRECORDTYPEID = [IDSETREGISTER].[RECORDTYPEID],
@SEGMENTRECORDTYPE = dbo.[UFN_MKTSEGMENT_GETMARKETINGRECORDTYPE]([MKTSEGMENT].[ID]),
@IDFORBUILDSOURCECODE = @TESTSEGMENTID,
@SAMPLESIZEEXCLUDEREMAINDER = 0,
@MKTSEGMENTID = [MKTSEGMENT].[ID]
from dbo.[MKTSEGMENTATIONTESTSEGMENT]
inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID]
inner join dbo.[MKTSEGMENTATION] on [MKTSEGMENTATION].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
left join dbo.[MKTSEGMENTSELECTION] on [MKTSEGMENTSELECTION].[SEGMENTID] = [MKTSEGMENT].[ID]
inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENTSELECTION].[SELECTIONID] or [IDSETREGISTER].[ID] = [MKTSEGMENT].[IDSETREGISTERID]
where [MKTSEGMENTATIONTESTSEGMENT].[ID] = @TESTSEGMENTID;
if @SEGMENTATIONISHISTORICAL = 0
begin
set @DATATABLE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME](@SEGMENTATIONID);
set @TEMPSEGMENTTABLENAME = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETEMPSEGMENTTABLENAME](@SEGMENTID);
set @CONSTITUENTFILEIMPORTUSED = dbo.[UFN_MKTCONSTITUENTFILEIMPORT_IMPORTTABLEEXISTS](@SEGMENTATIONID);
set @ISBBEC = dbo.[UFN_MKTRECORDSOURCE_VALIDFORBBEC](@SEGMENTRECORDSOURCEID);
if @MAILINGTYPECODE in (1, 5)
begin
if @ISBBEC = 1
begin
set @GIFTVIEWNAME = 'FINANCIALTRANSACTION';
set @GIFTVIEWPRIMARYKEYFIELD = 'ID';
set @GIFTVIEWDONORIDFIELD = 'CONSTITUENTID';
end
else
select
@GIFTVIEWNAME = [QUERYVIEWCATALOG].[OBJECTNAME],
@GIFTVIEWPRIMARYKEYFIELD = [QUERYVIEWCATALOG].[PRIMARYKEYFIELD],
@GIFTVIEWDONORIDFIELD = [MKTGIFTRECORDSOURCE].[DONORIDFIELD]
from dbo.[MKTGIFTRECORDSOURCE]
inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTGIFTRECORDSOURCE].[QUERYVIEWCATALOGID]
where [MKTGIFTRECORDSOURCE].[ID] = @SEGMENTRECORDSOURCEID;
end
else if @MAILINGTYPECODE = 2
begin
if @ISBBEC = 1
begin
set @MEMBERVIEWNAME = 'MEMBER';
set @MEMBERVIEWPRIMARYKEYFIELD = 'MEMBERSHIPID';
set @MEMBERVIEWDONORIDFIELD = 'CONSTITUENTID';
end
else
select
@MEMBERVIEWNAME = [QUERYVIEWCATALOG].[OBJECTNAME],
@MEMBERVIEWPRIMARYKEYFIELD = [QUERYVIEWCATALOG].[PRIMARYKEYFIELD],
@MEMBERVIEWDONORIDFIELD = [MKTMEMBERSHIPRECORDSOURCE].[MEMBERIDFIELD]
from dbo.[MKTMEMBERSHIPRECORDSOURCE]
inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTMEMBERSHIPRECORDSOURCE].[QUERYVIEWCATALOGID]
where [MKTMEMBERSHIPRECORDSOURCE].[ID] = @SEGMENTRECORDSOURCEID;
end
else if @MAILINGTYPECODE = 3
begin
if @ISBBEC = 1
begin
set @SPONSORVIEWNAME = 'SPONSORSHIP';
set @SPONSORVIEWPRIMARYKEYFIELD = 'ID';
set @SPONSORVIEWDONORIDFIELD = 'CONSTITUENTID';
end
else
select
@SPONSORVIEWNAME = [QUERYVIEWCATALOG].[OBJECTNAME],
@SPONSORVIEWPRIMARYKEYFIELD = [QUERYVIEWCATALOG].[PRIMARYKEYFIELD],
@SPONSORVIEWDONORIDFIELD = [MKTSPONSORSHIPRECORDSOURCE].[SPONSORIDFIELD]
from dbo.[MKTSPONSORSHIPRECORDSOURCE]
inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTSPONSORSHIPRECORDSOURCE].[QUERYVIEWCATALOGID]
where [MKTSPONSORSHIPRECORDSOURCE].[ID] = @SEGMENTRECORDSOURCEID;
end
set @INSERTSQL = '--Insert all the donors for this segment into the activated marketing effort data table...' + char(13) +
'insert into dbo.[' + @DATATABLE + '] (' + char(13) +
' [SEGMENTID], ' + char(13) +
' [TESTSEGMENTID], ' + char(13) +
(case when @MAILINGTYPECODE in (1, 5) then ' [REVENUEID], ' + char(13) else '' end) +
(case when @MAILINGTYPECODE = 2 then ' [MEMBERSHIPID], ' + char(13) else '' end) +
(case when @MAILINGTYPECODE = 3 then ' [SPONSORSHIPID], ' + char(13) else '' end) +
' [DONORID], ' + char(13) +
' [DONORQUERYVIEWCATALOGID], ' + char(13) +
' [SOURCECODE])' + char(13);
if @TESTSEGMENTID is not null
begin
--Create another temp table to hold all the IDs that we are going to insert into the mailing data table so
--that we can remove only these IDs from the segment temp table below before we process the next test segment.
set @TEMPNTHTABLENAME = '##TEMP_NTH_' + replace(cast(@SEGMENTID as nvarchar(36)), '-', '_');
if @MAILINGTYPECODE = 0
set @DATATYPE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_GETDONORIDDATATYPE](@SEGMENTATIONID);
else
set @DATATYPE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_GETIDSETIDDATATYPE](@SEGMENTATIONID);
declare @CREATESQL nvarchar(max);
set @CREATESQL = 'create table dbo.[' + @TEMPNTHTABLENAME + '] ([ID] ' + @DATATYPE + ' not null primary key' + (case when @MAILINGTYPECODE in (1, 5) and @ISBBEC = 1 then ', [DONORID] ' + dbo.[UFN_MKTSEGMENTATIONACTIVATE_GETDONORIDDATATYPE](@SEGMENTATIONID) + ' not null' else '' end) + ')';
exec (@CREATESQL);
set @INSERTSQL = @INSERTSQL + 'output INSERTED.[' + (case @MAILINGTYPECODE when 1 then 'REVENUEID' when 2 then 'MEMBERSHIPID' when 3 then 'SPONSORSHIPID' when 5 then 'REVENUEID' else 'DONORID' end) + ']' + (case when @MAILINGTYPECODE in (1, 5) and @ISBBEC = 1 then ', INSERTED.[DONORID]' else '' end) + ' into dbo.[' + @TEMPNTHTABLENAME + ']' + char(13);
end
if @MAILINGTYPECODE = 0 and @SEGMENTRECORDTYPE = 3
begin
--Get the consolidated view name if the source query view id for this segment is a consolidated view.
select
@CONSOLIDATEDVIEWNAME = [QUERYVIEWCATALOG].[OBJECTNAME],
@NEEDCAST = (case when [QUERYVIEWCATALOG].[PRIMARYKEYTYPENAME] = 'uniqueidentifier' then 0 else 1 end)
from dbo.[MKTCONSOLIDATEDQUERYVIEWSPEC]
inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTCONSOLIDATEDQUERYVIEWSPEC].[CONSOLIDATEDQUERYVIEWCATALOGID]
where [MKTCONSOLIDATEDQUERYVIEWSPEC].[ID] = @SEGMENTRECORDSOURCEID;
set @SQL = 'declare @CONSOLIDATEDSOURCECODETABLE table([SOURCEQUERYVIEWID] uniqueidentifier primary key, [SOURCECODE] nvarchar(255));' + char(13);
if @NEEDCAST = 1
begin
--Get the donor ID data type from the record source query view...
select
@DATATYPE = [PRIMARYKEYTYPENAME]
from dbo.[QUERYVIEWCATALOG]
where [ID] = @SEGMENTRECORDSOURCEID;
set @SQL = @SQL + 'declare @SEGMENTDONORS table([DONORID] ' + @DATATYPE + ', [LISTDONORID] uniqueidentifier);' + char(13);
end
set @SQL = @SQL + char(13) +
'--Get all the source query view IDs (and their sourcecodes) that make up the consolidated list...' + char(13) +
'insert into @CONSOLIDATEDSOURCECODETABLE ([SOURCEQUERYVIEWID], [SOURCECODE])' + char(13) +
' select @SEGMENTRECORDSOURCEID, dbo.[UFN_MKTSOURCECODE_BUILDCODE](@IDFORBUILDSOURCECODE, @SEGMENTRECORDSOURCEID, default)' + char(13) +
' union all' + char(13) +
' select [MKTSEGMENTLIST].[QUERYVIEWCATALOGID], dbo.[UFN_MKTSOURCECODE_BUILDCODE](@IDFORBUILDSOURCECODE, [MKTSEGMENTLIST].[QUERYVIEWCATALOGID], default)' + char(13) +
' from dbo.[MKTCONSOLIDATEDQUERYVIEWSPEC]' + char(13) +
' inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[CONSOLIDATEDQUERYVIEWID] = [MKTCONSOLIDATEDQUERYVIEWSPEC].[CONSOLIDATEDQUERYVIEWCATALOGID]' + char(13) +
' where [MKTCONSOLIDATEDQUERYVIEWSPEC].[ID] = @SEGMENTRECORDSOURCEID;' + char(13) +
char(13);
if @NEEDCAST = 1
-- if a test segment is slated to receive 0 offers, then it needs to be forced to have 0 offers,
-- hence the or @TESTSEGMENTID is not null
set @SQL = @SQL +
'--Split out the segment donor IDs into their respective data types (to speed up this SQL)...' + char(13) +
'insert into @SEGMENTDONORS ([DONORID], [LISTDONORID])' + char(13) +
' select' + (case when @USEMAXROWS = 1 then ' top(@MAXROWS)' else '' end) + char(13) +
' (case when patindex(''[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]-[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]-[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]-[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]-[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]'', [ID]) = 0 then [ID] else null end),' + char(13) +
' (case when patindex(''[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]-[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]-[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]-[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]-[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]'', [ID]) > 0 then [ID] else null end)' + char(13);
end
else
begin
--Get the record source query view ID if the segment came from a record source record type...
select @SOURCEQUERYVIEWID = [MKTRECORDSOURCE].[ID]
from dbo.[MKTRECORDSOURCE]
inner join dbo.[MKTGIFTRECORDSOURCE] on [MKTGIFTRECORDSOURCE].[ID] = [MKTRECORDSOURCE].[ID]
left outer join dbo.[MKTMEMBERSHIPRECORDSOURCE] on [MKTMEMBERSHIPRECORDSOURCE].[ID] = [MKTRECORDSOURCE].[ID]
left outer join dbo.[MKTSPONSORSHIPRECORDSOURCE] on [MKTSPONSORSHIPRECORDSOURCE].[ID] = [MKTRECORDSOURCE].[ID]
inner join dbo.[QUERYVIEWCATALOG] on ([QUERYVIEWCATALOG].[ID] = [MKTRECORDSOURCE].[ID] or [QUERYVIEWCATALOG].[ID] = [MKTGIFTRECORDSOURCE].[QUERYVIEWCATALOGID] or [QUERYVIEWCATALOG].[ID] = isnull([MKTMEMBERSHIPRECORDSOURCE].[QUERYVIEWCATALOGID], convert(uniqueidentifier, '00000000-0000-0000-0000-000000000000')) or [QUERYVIEWCATALOG].[ID] = isnull([MKTSPONSORSHIPRECORDSOURCE].[QUERYVIEWCATALOGID], convert(uniqueidentifier, '00000000-0000-0000-0000-000000000000')))
left outer join dbo.[RECORDTYPECOMPATIBILITYMAP] as [MAP] on [MAP].[RECORDTYPE1ID] = [QUERYVIEWCATALOG].[RECORDTYPEID]
where ([QUERYVIEWCATALOG].[RECORDTYPEID] = @SEGMENTRECORDTYPEID or [MAP].[RECORDTYPE2ID] = @SEGMENTRECORDTYPEID)
and dbo.[UFN_MKTRECORDSOURCE_VALIDFORPRODUCT]([MKTRECORDSOURCE].[ID]) = 1;
if @SOURCEQUERYVIEWID is null
--Segment is based on a list, so get the query view ID of the list...
select @SOURCEQUERYVIEWID = [QUERYVIEWCATALOGID]
from dbo.[MKTSEGMENTLIST]
where [IDSETRECORDTYPEID] = @SEGMENTRECORDTYPEID;
set @SOURCECODE = dbo.[UFN_MKTSOURCECODE_BUILDCODE](@IDFORBUILDSOURCECODE, default, default);
end
if @SEGMENTRECORDTYPE <> 3 or (@SEGMENTRECORDTYPE = 3 and @NEEDCAST = 0)
begin
-- if a test segment is slated to receive 0 offers, then it needs to be forced to have 0 offers,
-- hence the or @TESTSEGMENTID is not null
set @SQL = isnull(@SQL, '') +
@INSERTSQL +
' select' + (case when @USEMAXROWS = 1 then ' top(@MAXROWS)' else '' end) + char(13) +
' @SEGMENTID,' + char(13) +
' ' + (case when @TESTSEGMENTID is null then 'null' else '@TESTSEGMENTID' end) + ',' + char(13) +
' [TEMP].[ID],' + char(13);
if @MAILINGTYPECODE = 1
begin
if @ISBBEC = 1
--For BBEC, we need to use the acknowledgee ID instead of the gift donor ID...
set @SQL = @SQL + ' [TEMP].[DONORID],' + char(13);
else
set @SQL = @SQL + ' [GIFTS].[' + @GIFTVIEWDONORIDFIELD + '],' + char(13);
end
else if @MAILINGTYPECODE = 2
set @SQL = @SQL + ' [MEMBERS].[' + @MEMBERVIEWDONORIDFIELD + '],' + char(13);
else if @MAILINGTYPECODE = 3
set @SQL = @SQL + ' [SPONSORS].[' + @SPONSORVIEWDONORIDFIELD + '],' + char(13);
else if @MAILINGTYPECODE = 5
set @SQL = @SQL + ' [GIFTS].[' + @GIFTVIEWDONORIDFIELD + '],' + char(13);
if @SEGMENTRECORDTYPE <> 3
set @SQL = @SQL +
' @SOURCEQUERYVIEWID,' + char(13) +
' @SOURCECODE' + char(13);
else
set @SQL = @SQL +
' [TEMPSOURCECODETABLE].[SOURCEQUERYVIEWID],' + char(13) +
' [TEMPSOURCECODETABLE].[SOURCECODE]' + char(13);
end
set @SQL = @SQL + ' from dbo.[' + @TEMPSEGMENTTABLENAME + '] as [TEMP]';
if @MAILINGTYPECODE = 1
begin
--We don't have to worry about BBEC here because the appropriate joins happen in the populate USP...
if @ISBBEC <> 1
set @SQL = @SQL + char(13) + ' inner join dbo.[' + @GIFTVIEWNAME + '] as [GIFTS] on [GIFTS].[' + @GIFTVIEWPRIMARYKEYFIELD + '] = [TEMP].[ID]';
end
else if @MAILINGTYPECODE = 2
set @SQL = @SQL + char(13) +
' inner join dbo.[' + @MEMBERVIEWNAME + '] as [MEMBERS] on [MEMBERS].[' + @MEMBERVIEWPRIMARYKEYFIELD + '] = [TEMP].[ID] and [MEMBERS].[ISPRIMARY] = 1 and [MEMBERS].[ISDROPPED] = 0' + char(13) +
' inner join dbo.[MEMBERSHIP] on [MEMBERSHIP].[ID] = [MEMBERS].[' + @MEMBERVIEWPRIMARYKEYFIELD + '] and [MEMBERSHIP].[STATUSCODE] <> 1';
else if @MAILINGTYPECODE = 3
set @SQL = @SQL + char(13) + ' inner join dbo.[' + @SPONSORVIEWNAME + '] as [SPONSORS] on [SPONSORS].[' + @SPONSORVIEWPRIMARYKEYFIELD + '] = [TEMP].[ID]';
else if @SEGMENTRECORDTYPE = 3 and @NEEDCAST = 0
set @SQL = @SQL + char(13) + ' inner join dbo.[' + @CONSOLIDATEDVIEWNAME + '] as [CONSOL] on [CONSOL].[ID] = [TEMP].[ID]' + char(13) +
' inner join @CONSOLIDATEDSOURCECODETABLE as [TEMPSOURCECODETABLE] on [TEMPSOURCECODETABLE].[SOURCEQUERYVIEWID] = [CONSOL].[SOURCEQUERYVIEWID]';
else if @MAILINGTYPECODE = 5
begin
set @SQL = @SQL + char(13) + ' inner join dbo.[' + @GIFTVIEWNAME + '] as [GIFTS] on [GIFTS].[' + @GIFTVIEWPRIMARYKEYFIELD + '] = [TEMP].[ID]';
if @ISBBEC = 1
set @SQL = @SQL + ' and [GIFTS].[DELETEDON] is null' + char(13) +
' inner join dbo.[REVENUE_EXT] on [REVENUE_EXT].[ID] = [GIFTS].[' + @GIFTVIEWPRIMARYKEYFIELD + ']';
end
--Only perform nth or random or top if this is a test segment or if this is a segment that excludes its remainder from the rest of the segments.
--All other segments have already been through this nth or random or top algorithm, so don't do it again.
if @TESTSEGMENTID is not null or @SAMPLESIZEEXCLUDEREMAINDER = 1
begin
if @CONSTITUENTFILEIMPORTUSED = 1 and @TESTSEGMENTID is not null
begin
declare @CONSTITUENTFILEIMPORTTABLE nvarchar(256);
set @CONSTITUENTFILEIMPORTTABLE = dbo.[UFN_MKTCONSTITUENTFILEIMPORT_BUILDTABLENAME](@SEGMENTATIONID);
set @SQL = @SQL + char(13) + ' inner join (select distinct [RECORDID], [SEGMENTATIONTESTSEGMENTID] from dbo.[' + @CONSTITUENTFILEIMPORTTABLE + ']) as [IMPORT] on [IMPORT].[RECORDID] = [TEMP].[ID] and [IMPORT].[SEGMENTATIONTESTSEGMENTID] = @TESTSEGMENTID';
end
else
begin
if @USETOP = 1
begin
--Force the top-ranked set of IDs by using this order by clause
set @SQL = @SQL + char(13) + ' order by [TEMP].[ROW]';
end
else if @USENTH = 1
begin
--Grab only every Nth record...
declare @COUNTSQL nvarchar(max);
set @COUNTSQL = 'select @RECORDCOUNT = count([ID]) from dbo.[' + @TEMPSEGMENTTABLENAME + ']';
exec sp_executesql @COUNTSQL, N'@RECORDCOUNT int output', @RECORDCOUNT = @RECORDCOUNT output;
--If @MAXROWS is more than half of @RECORDCOUNT, then Nth record will come out to every 1 record, which isn't very good.
--So if Nth record is 1, then reverse the Nth calculation so we get a better distribution of records than every 1 record.
if (@RECORDCOUNT > @MAXROWS) and (@MAXROWS > 0)
begin
set @SQL = @SQL + char(13) + ' where ';
set @SQL = @SQL + 'floor(([TEMP].[ROW] - 1) % @NTHRECORD) ';
set @NTHRECORD = cast(@RECORDCOUNT as decimal(20,8)) / cast(@MAXROWS as decimal(20,8));
if floor(@NTHRECORD) = 1
begin
set @NTHRECORD = cast(@RECORDCOUNT as decimal(20,8)) / cast((@RECORDCOUNT - @MAXROWS) as decimal(20,8));
set @SQL = @SQL + '<> 0';
end
else
set @SQL = @SQL + '= 0';
set @SQL = @SQL + char(13) + ' order by [TEMP].[ROW]';
end
end
else if @USERANDOM = 1
begin
--Force a random set of IDs by using this order by clause
set @SQL = @SQL + char(13) + ' order by NewID()';
end
end
end
if @MAILINGTYPECODE = 0 and @SEGMENTRECORDTYPE = 3 and @NEEDCAST = 1
set @SQL = @SQL + ';' + char(13) +
char(13) +
@INSERTSQL +
' --Record source' + char(13) +
' select' + char(13) +
' @SEGMENTID,' + char(13) +
' ' + (case when @TESTSEGMENTID is null then 'null' else '@TESTSEGMENTID' end) + ',' + char(13) +
' cast([DONORID] as varchar(36)),' + char(13) +
' @SEGMENTRECORDSOURCEID,' + char(13) +
' (select [SOURCECODE] from @CONSOLIDATEDSOURCECODETABLE where [SOURCEQUERYVIEWID] = @SEGMENTRECORDSOURCEID)' + char(13) +
' from @SEGMENTDONORS as [DONORS]' + char(13) +
' where [DONORID] is not null' + char(13) +
' union all' + char(13) +
' --Lists' + char(13) +
' select' + char(13) +
' @SEGMENTID,' + char(13) +
' ' + (case when @TESTSEGMENTID is null then 'null' else '@TESTSEGMENTID' end) + ',' + char(13) +
' cast([DONORS].[LISTDONORID] as varchar(36)),' + char(13) +
' [TEMPSOURCECODETABLE].[SOURCEQUERYVIEWID],' + char(13) +
' [TEMPSOURCECODETABLE].[SOURCECODE]' + char(13) +
' from @SEGMENTDONORS as [DONORS]' + char(13) +
' inner join dbo.[MKTSEGMENTLISTDATA] on [MKTSEGMENTLISTDATA].[ID] = [DONORS].[LISTDONORID]' + char(13) +
' inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENTLISTDATA].[SEGMENTLISTID]' + char(13) +
' inner join @CONSOLIDATEDSOURCECODETABLE as [TEMPSOURCECODETABLE] on [TEMPSOURCECODETABLE].[SOURCEQUERYVIEWID] = [MKTSEGMENTLIST].[QUERYVIEWCATALOGID]' + char(13) +
' where [DONORS].[LISTDONORID] is not null;';
exec sp_executesql @SQL, N'@MAXROWS int, @SEGMENTID uniqueidentifier, @TESTSEGMENTID uniqueidentifier, @SOURCEQUERYVIEWID uniqueidentifier, @IDFORBUILDSOURCECODE uniqueidentifier, @SOURCECODE nvarchar(50), @NTHRECORD decimal(20,5), @SEGMENTRECORDSOURCEID uniqueidentifier, @SEGMENTATIONID uniqueidentifier, @MKTSEGMENTID uniqueidentifier',
@MAXROWS = @MAXROWS,
@SEGMENTID = @SEGMENTID,
@TESTSEGMENTID = @TESTSEGMENTID,
@SOURCEQUERYVIEWID = @SOURCEQUERYVIEWID,
@IDFORBUILDSOURCECODE = @IDFORBUILDSOURCECODE,
@SOURCECODE = @SOURCECODE,
@NTHRECORD = @NTHRECORD,
@SEGMENTRECORDSOURCEID = @SEGMENTRECORDSOURCEID,
@SEGMENTATIONID = @SEGMENTATIONID,
@MKTSEGMENTID = @MKTSEGMENTID;
if @MAILINGTYPECODE in (1, 5)
set @INDEXNAME = 'IX_' + @DATATABLE + '_DONORQUERYVIEWCATALOGID_REVENUEID_DONORID';
else if @MAILINGTYPECODE = 2
set @INDEXNAME = 'IX_' + @DATATABLE + '_DONORQUERYVIEWCATALOGID_MEMBERSHIPID_DONORID';
else if @MAILINGTYPECODE = 3
set @INDEXNAME = 'IX_' + @DATATABLE + '_DONORQUERYVIEWCATALOGID_SPONSORSHIPID_DONORID';
else
set @INDEXNAME = 'IX_' + @DATATABLE + '_DONORQUERYVIEWCATALOGID_DONORID';
set @SQL = 'update statistics dbo.[' + @DATATABLE + '] [' + @INDEXNAME + ']';
exec (@SQL);
if @TESTSEGMENTID is null
begin
--We are done activating this segment and all its test segments, so drop the temp table...
exec ('drop table ' + @TEMPSEGMENTTABLENAME);
--Cache the record count for the segment
set @SQL = 'select @RECORDCOUNT = count(*) from dbo.[' + @DATATABLE + '] where [SEGMENTID] = @SEGMENTID';
exec sp_executesql @SQL, N'@SEGMENTID uniqueidentifier, @RECORDCOUNT int output', @SEGMENTID = @SEGMENTID, @RECORDCOUNT = @RECORDCOUNT output;
if @MAILINGTYPECODE = 1 --Acknowledgment
--Since acknowledgments don't run the previous segment exclusions caching like normal segments, we
--need to manually add the cache record here so that other process later on can pick up the counts.
insert into dbo.[MKTSEGMENTATIONSEGMENTCACHEINFO] (
[SEGMENTID],
[RECORDCOUNT],
[OFFERCOUNT],
[RECORDCOUNTDATECACHED]
) values (
@SEGMENTID,
@RECORDCOUNT,
@RECORDCOUNT,
getdate()
);
else
update dbo.[MKTSEGMENTATIONSEGMENTCACHEINFO] set
[OFFERCOUNT] = @RECORDCOUNT,
[RECORDCOUNTDATECACHED] = getdate()
where [SEGMENTID] = @SEGMENTID;
end
else
begin
--Delete all the rows from the temp table that we inserted into the mailing data table, and then resequence
--the row numbers in the temp table so that activating the next test segment will work correctly.
set @SQL = 'drop index [IX_' + replace(@TEMPSEGMENTTABLENAME, '#', '') + '_ROW] on dbo.[' + @TEMPSEGMENTTABLENAME + '];' + char(13) +
'alter table dbo.[' + @TEMPSEGMENTTABLENAME + '] drop column [ROW];' + char(13) +
'delete dbo.[' + @TEMPSEGMENTTABLENAME + '] from dbo.[' + @TEMPSEGMENTTABLENAME + '] as [TEMPSEG] inner join dbo.[' + @TEMPNTHTABLENAME + '] as [TEMPTEST] on [TEMPTEST].[ID] = [TEMPSEG].[ID]' + (case when @MAILINGTYPECODE in (1, 5) and @ISBBEC = 1 then ' and [TEMPTEST].[DONORID] = [TEMPSEG].[DONORID]' else '' end) + ';' + char(13) +
'drop table dbo.[' + @TEMPNTHTABLENAME + '];' + char(13) +
'alter table dbo.[' + @TEMPSEGMENTTABLENAME + '] add [ROW] [int] not null identity (1, 1);' + char(13) +
'create unique nonclustered index [IX_' + replace(@TEMPSEGMENTTABLENAME, '#', '') + '_ROW] on [dbo].[' + @TEMPSEGMENTTABLENAME + '] ([ROW] asc) with (PAD_INDEX = off, SORT_IN_TEMPDB = off, DROP_EXISTING = off, IGNORE_DUP_KEY = off, ONLINE = off);';
exec (@SQL);
end
end
else -- @SEGMENTATIONISHISTORICAL = 1
begin
if @TESTSEGMENTID is null
insert into dbo.[MKTSEGMENTATIONSEGMENTCACHEINFO] (
[SEGMENTID],
[RECORDCOUNT],
[OFFERCOUNT],
[RECORDCOUNTDATECACHED]
)
select
@SEGMENTID,
(case when @MAXROWS > 0 then @MAXROWS else (case when [MKTSEGMENTATIONSEGMENT].[HISTORICALQUANTITY] > 0 then [MKTSEGMENTATIONSEGMENT].[HISTORICALQUANTITY] else [MKTSEGMENT].[HISTORICALQUANTITY] end) end),
(case when @MAXROWS > 0 then @MAXROWS else (case when [MKTSEGMENTATIONSEGMENT].[HISTORICALQUANTITY] > 0 then [MKTSEGMENTATIONSEGMENT].[HISTORICALQUANTITY] else [MKTSEGMENT].[HISTORICALQUANTITY] end) end),
getdate()
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
where [MKTSEGMENTATIONSEGMENT].[ID] = @SEGMENTID;
end
if @MAILINGTYPECODE = 3 and @ISACTIVATING = 1
begin
declare @SPONSORSHIPMAILINGTEMPLATEID uniqueidentifier;
declare @CHANGEAGENTID uniqueidentifier;
exec dbo.[USP_CHANGEAGENT_GETORCREATECHANGEAGENT] @CHANGEAGENTID output;
select
@SPONSORSHIPMAILINGTEMPLATEID = [MKTSPONSORSHIPMAILINGPROCESS].[SPONSORSHIPMAILINGTEMPLATEID]
from dbo.[MKTSPONSORSHIPMAILINGPROCESSSEGMENTATION]
inner join dbo.[MKTSPONSORSHIPMAILINGPROCESSSTATUS] on [MKTSPONSORSHIPMAILINGPROCESSSTATUS].[ID] = [MKTSPONSORSHIPMAILINGPROCESSSEGMENTATION].[SPONSORSHIPMAILINGPROCESSSTATUSID]
inner join dbo.[MKTSPONSORSHIPMAILINGPROCESS] on [MKTSPONSORSHIPMAILINGPROCESS].[ID] = [MKTSPONSORSHIPMAILINGPROCESSSTATUS].[PARAMETERSETID]
where [MKTSPONSORSHIPMAILINGPROCESSSEGMENTATION].[SEGMENTATIONID] = @SEGMENTATIONID;
set @SQL = 'insert into dbo.[MKTSPONSORSHIPMAILINGTEMPLATEACTIVATED] (' + char(13) +
' [MKTSEGMENTATIONID],' + char(13)+
' [SPONSORSHIPID],' + char(13) +
' [DATATABLE],' + char(13) +
' [MKTSPONSORSHIPMAILINGTEMPLATEID],' + char(13) +
' [MKTSEGMENTID],' + char(13) +
' [DATESENT],' + char(13) +
' [ADDEDBYID],' + char(13) +
' [CHANGEDBYID])' + char(13) +
'select' + char(13) +
' @SEGMENTATIONID,' + char(13) +
' [SPONSORSHIPID],' + char(13) +
' @DATATABLE,' + char(13) +
' @SPONSORSHIPMAILINGTEMPLATEID,' + char(13) +
' @SEGMENTID,' + char(13) +
' getdate(),' + char(13) +
' @CHANGEAGENTID,' + char(13) +
' @CHANGEAGENTID'+ char(13) +
'from dbo.[' + @DATATABLE + ']';
exec sp_executesql @SQL, N'@SEGMENTATIONID uniqueidentifier, @DATATABLE nvarchar(510), @SPONSORSHIPMAILINGTEMPLATEID uniqueidentifier, @SEGMENTID uniqueidentifier, @CHANGEAGENTID uniqueidentifier',
@SEGMENTATIONID = @SEGMENTATIONID,
@DATATABLE = @DATATABLE,
@SPONSORSHIPMAILINGTEMPLATEID = @SPONSORSHIPMAILINGTEMPLATEID,
@SEGMENTID = @MKTSEGMENTID,
@CHANGEAGENTID = @CHANGEAGENTID;
end
end try
begin catch
exec dbo.[USP_RAISE_ERROR];
return 1;
end catch
return 0;