USP_MKTSEGMENTATIONACTIVATE_SETASKLADDERINFO
Populates the temporary table for activating a segment.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SEGMENTATIONID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.[USP_MKTSEGMENTATIONACTIVATE_SETASKLADDERINFO]
(
@SEGMENTATIONID uniqueidentifier
)
as
set nocount on;
declare @SQL nvarchar(max);
declare @DATATABLE nvarchar(128);
declare @DBOBJECTNAME sysname;
declare @DONORIDDATATYPE nvarchar(128);
declare @IDSETIDDATATYPE nvarchar(128);
declare @ASKLADDERID uniqueidentifier;
declare @IDSETREGISTERID uniqueidentifier;
declare @ENTRYAMOUNTFIELD nvarchar(128);
declare @ENTRYAMOUNTJOINSQL nvarchar(max);
declare @JOINIDFIELD nvarchar(128);
declare @TABLENAME sysname;
declare @PKFIELDNAME sysname;
declare @FIELDNAME sysname
declare @ACTIVE bit;
declare @ASKLADDERS table(
[ASKLADDERID] uniqueidentifier not null,
[RECORDSOURCEID] uniqueidentifier not null,
[ISOVERRIDE] bit not null,
[ISSEGMENT] bit not null,
[ISTESTSEGMENT] bit not null
);
declare @MONEYFIELDS table(
[RECORDSOURCEID] uniqueidentifier not null,
[RECORDTYPE] nvarchar(100),
[PARENTTYPE] nvarchar(100),
[NAME] nvarchar(128),
[DISPLAYNAME] nvarchar(128),
[OBJECTNAME] nvarchar(128),
[OBJECTTYPE] nvarchar(100),
[PRIMARYKEYFIELD] nvarchar(128),
[OBJECTKEY] nvarchar(257)
);
begin try
select
@DATATABLE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME]([ID]),
@DONORIDDATATYPE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_GETDONORIDDATATYPE]([ID]),
@JOINIDFIELD = (case [MAILINGTYPECODE]
when 1 then 'REVENUEID'
when 2 then 'MEMBERSHIPID'
when 3 then 'SPONSORSHIPID'
when 5 then 'REVENUEID'
else 'DONORID'
end),
@ACTIVE = [ACTIVE]
from dbo.[MKTSEGMENTATION]
where [ID] = @SEGMENTATIONID;
--Get all the combinations of ask ladders for this mailing...
insert into @ASKLADDERS ([ASKLADDERID], [RECORDSOURCEID], [ISOVERRIDE], [ISSEGMENT], [ISTESTSEGMENT])
--Ask ladder overrides
select
[MKTSEGMENTATIONASKLADDEROVERRIDE].[ASKLADDERID],
coalesce([MKTSEGMENT].[QUERYVIEWCATALOGID], [MKTRECORDSOURCE].[ID], [MKTGIFTRECORDSOURCE].[ID], [MKTMEMBERSHIPRECORDSOURCE].[ID], [MKTSPONSORSHIPRECORDSOURCE].[ID]) as [RECORDSOURCEID],
1 as [ISOVERRIDE],
0 as [ISSEGMENT],
0 as [ISTESTSEGMENT]
from dbo.[MKTSEGMENTATIONASKLADDEROVERRIDE]
inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENTATIONASKLADDEROVERRIDE].[IDSETREGISTERID]
inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[RECORDTYPEID] = [IDSETREGISTER].[RECORDTYPEID]
left join dbo.[MKTRECORDSOURCE] on [MKTRECORDSOURCE].[ID] = [QUERYVIEWCATALOG].[ID]
left join dbo.[MKTGIFTRECORDSOURCE] on [MKTGIFTRECORDSOURCE].[QUERYVIEWCATALOGID] = [QUERYVIEWCATALOG].[ID]
left join dbo.[MKTMEMBERSHIPRECORDSOURCE] on [MKTMEMBERSHIPRECORDSOURCE].[QUERYVIEWCATALOGID] = [QUERYVIEWCATALOG].[ID]
left join dbo.[MKTSPONSORSHIPRECORDSOURCE] on [MKTSPONSORSHIPRECORDSOURCE].[QUERYVIEWCATALOGID] = [QUERYVIEWCATALOG].[ID]
left join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[QUERYVIEWCATALOGID] = [QUERYVIEWCATALOG].[ID]
left join dbo.[MKTSEGMENT] on [MKTSEGMENT].[CURRENTSEGMENTLISTID] = [MKTSEGMENTLIST].[ID]
where [MKTSEGMENTATIONASKLADDEROVERRIDE].[SEGMENTATIONID] = @SEGMENTATIONID
and ([MKTSEGMENTLIST].[ID] is null or [MKTSEGMENTLIST].[STATUSCODE] = 3)
and coalesce([MKTSEGMENT].[QUERYVIEWCATALOGID], [MKTRECORDSOURCE].[ID], [MKTGIFTRECORDSOURCE].[ID], [MKTMEMBERSHIPRECORDSOURCE].[ID], [MKTSPONSORSHIPRECORDSOURCE].[ID]) is not null
union
--Segments
select
[MKTSEGMENTATIONSEGMENT].[ASKLADDERID],
[MKTSEGMENT].[QUERYVIEWCATALOGID] as [RECORDSOURCEID],
0 as [ISOVERRIDE],
1 as [ISSEGMENT],
0 as [ISTESTSEGMENT]
from dbo.[MKTSEGMENTATIONSEGMENT]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENTATIONSEGMENT].[SEGMENTID] = [MKTSEGMENT].[ID]
inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENT].[IDSETREGISTERID]
left join dbo.[MKTSEGMENTATIONSEGMENTLIST] on [MKTSEGMENTATIONSEGMENTLIST].[ID] = [MKTSEGMENTATIONSEGMENT].[ID]
left join dbo.[MKTSEGMENTLIST] on ([MKTSEGMENTLIST].[ID] = case when @ACTIVE = 1 then [MKTSEGMENTATIONSEGMENTLIST].[SEGMENTLISTID] else [MKTSEGMENT].[CURRENTSEGMENTLISTID] end)
where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
and [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 0
and ([MKTSEGMENT].[SEGMENTTYPECODE] <> 2 or [MKTSEGMENTLIST].[TYPECODE] = 0) --Exclude vendor managed segments
and [MKTSEGMENTATIONSEGMENT].[ASKLADDERID] is not null
union
--Test segments
select
[MKTSEGMENTATIONTESTSEGMENT].[ASKLADDERID],
[MKTSEGMENT].[QUERYVIEWCATALOGID] as [RECORDSOURCEID],
0 as [ISOVERRIDE],
0 as [ISSEGMENT],
1 as [ISTESTSEGMENT]
from dbo.[MKTSEGMENTATIONTESTSEGMENT]
inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID] = [MKTSEGMENTATIONSEGMENT].[ID]
inner join dbo.[MKTSEGMENT] on [MKTSEGMENTATIONSEGMENT].[SEGMENTID] = [MKTSEGMENT].[ID]
inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENT].[IDSETREGISTERID]
left join dbo.[MKTSEGMENTATIONSEGMENTLIST] on [MKTSEGMENTATIONSEGMENTLIST].[ID] = [MKTSEGMENTATIONSEGMENT].[ID]
left join dbo.[MKTSEGMENTLIST] on ([MKTSEGMENTLIST].[ID] = case when @ACTIVE = 1 then [MKTSEGMENTATIONSEGMENTLIST].[SEGMENTLISTID] else [MKTSEGMENT].[CURRENTSEGMENTLISTID] end)
where [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
and [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 0
and ([MKTSEGMENT].[SEGMENTTYPECODE] <> 2 or [MKTSEGMENTLIST].[TYPECODE] = 0) --Exclude vendor managed segments
and [MKTSEGMENTATIONTESTSEGMENT].[ASKLADDERID] is not null;
--Get all the money fields for distinct record sources...
insert into @MONEYFIELDS ([RECORDSOURCEID], [RECORDTYPE], [PARENTTYPE], [NAME], [DISPLAYNAME], [OBJECTNAME], [OBJECTTYPE], [PRIMARYKEYFIELD], [OBJECTKEY])
select
[ASKLADDERS].[RECORDSOURCEID],
[MF].[RECORDTYPE],
[MF].[PARENTTYPE],
[MF].[NAME],
[MF].[DISPLAYNAME],
[MF].[OBJECTNAME],
[MF].[OBJECTTYPE],
[MF].[PRIMARYKEYFIELD],
[MF].[OBJECTKEY]
from (select distinct [RECORDSOURCEID] from @ASKLADDERS) as [ASKLADDERS]
outer apply dbo.[UFN_MKTASKLADDER_GETMONEYFIELDS]([ASKLADDERS].[RECORDSOURCEID]) as [MF];
--Overrides: Update the ASKLADDERID and ENTRYAMOUNT...
declare OVERRIDECURSOR cursor local fast_forward for
select
[ASKLADDERS].[ASKLADDERID],
[MF].[OBJECTNAME],
[MF].[PRIMARYKEYFIELD],
[MF].[NAME],
[IDSETREGISTER].[ID],
'[' + [IDSETREGISTER].[DBOBJECTNAME] + ']' + (case [IDSETREGISTER].[OBJECTTYPE] when 1 then '()' when 2 then '(@IDSETREGISTERID)' else '' end),
(select t.[name] from sys.types t inner join sys.columns c on c.system_type_id = t.system_type_id where c.[object_id] = object_id('dbo.[' + [IDSETREGISTER].[DBOBJECTNAME] + ']') and c.[name] = 'ID')
from @ASKLADDERS as [ASKLADDERS]
inner join dbo.[MKTASKLADDER] on [MKTASKLADDER].[ID] = [ASKLADDERS].[ASKLADDERID]
left join @MONEYFIELDS as [MF] on [MF].[RECORDSOURCEID] = [ASKLADDERS].[RECORDSOURCEID] and [MF].[OBJECTKEY] = [MKTASKLADDER].[OBJECTKEY]
inner join dbo.[MKTSEGMENTATIONASKLADDEROVERRIDE] on [MKTSEGMENTATIONASKLADDEROVERRIDE].[ASKLADDERID] = [ASKLADDERS].[ASKLADDERID]
inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[ID] = [MKTSEGMENTATIONASKLADDEROVERRIDE].[IDSETREGISTERID]
where [ASKLADDERS].[ISOVERRIDE] = 1
and [MKTSEGMENTATIONASKLADDEROVERRIDE].[SEGMENTATIONID] = @SEGMENTATIONID
order by [MKTSEGMENTATIONASKLADDEROVERRIDE].[SEQUENCE] asc;
open OVERRIDECURSOR;
fetch next from OVERRIDECURSOR into @ASKLADDERID, @TABLENAME, @PKFIELDNAME, @FIELDNAME, @IDSETREGISTERID, @DBOBJECTNAME, @IDSETIDDATATYPE;
while (@@FETCH_STATUS = 0)
begin
set @ENTRYAMOUNTFIELD = dbo.[UFN_MKTSEGMENTATIONASKLADDER_ENTRYAMOUNT](@ASKLADDERID, 'EA', @FIELDNAME);
set @ENTRYAMOUNTJOINSQL = dbo.[UFN_MKTSEGMENTATIONASKLADDER_JOINSQL](@ASKLADDERID, @DATATABLE, 'DONORID', 'DT', 'EA', @TABLENAME, @PKFIELDNAME);
set @SQL = 'update dbo.[' + @DATATABLE + '] set' + char(13) +
' [ASKLADDERID] = @ASKLADDERID,' + char(13) +
' [ENTRYAMOUNT] = ' + @ENTRYAMOUNTFIELD + char(13) +
'from dbo.[' + @DATATABLE + '] as [DT]' + char(13) +
'inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [DT].[SEGMENTID]' + char(13);
if @DONORIDDATATYPE = @IDSETIDDATATYPE
set @SQL += 'inner join dbo.' + @DBOBJECTNAME + ' as [IT] on [IT].[ID] = [DT].[' + @JOINIDFIELD + ']' + char(13);
else
set @SQL += 'inner join dbo.' + @DBOBJECTNAME + ' as [IT] on convert(varchar(36), [DT].[' + @JOINIDFIELD + ']) = convert(varchar(36), [IT].[ID])' + char(13);
if @ENTRYAMOUNTJOINSQL is not null
set @SQL += @ENTRYAMOUNTJOINSQL + char(13);
set @SQL += 'where [DT].[ASKLADDERID] is null' + char(13) +
'and [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 0;';
exec sp_executesql @SQL, N'@ASKLADDERID uniqueidentifier, @IDSETREGISTERID uniqueidentifier', @ASKLADDERID = @ASKLADDERID, @IDSETREGISTERID = @IDSETREGISTERID;
fetch next from OVERRIDECURSOR into @ASKLADDERID, @TABLENAME, @PKFIELDNAME, @FIELDNAME, @IDSETREGISTERID, @DBOBJECTNAME, @IDSETIDDATATYPE;
end
close OVERRIDECURSOR;
deallocate OVERRIDECURSOR;
--Segments: Update the ASKLADDERID and ENTRYAMOUNT...
declare SEGMENTCURSOR cursor local fast_forward for
select distinct
[ASKLADDERS].[ASKLADDERID],
[MF].[OBJECTNAME],
[MF].[PRIMARYKEYFIELD],
[MF].[NAME]
from @ASKLADDERS as [ASKLADDERS]
inner join dbo.[MKTASKLADDER] on [MKTASKLADDER].[ID] = [ASKLADDERS].[ASKLADDERID]
left join @MONEYFIELDS as [MF] on [MF].[RECORDSOURCEID] = [ASKLADDERS].[RECORDSOURCEID] and [MF].[OBJECTKEY] = [MKTASKLADDER].[OBJECTKEY]
inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ASKLADDERID] = [ASKLADDERS].[ASKLADDERID]
where [ASKLADDERS].[ISSEGMENT] = 1
and [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
and [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 0;
open SEGMENTCURSOR;
fetch next from SEGMENTCURSOR into @ASKLADDERID, @TABLENAME, @PKFIELDNAME, @FIELDNAME;
while (@@FETCH_STATUS = 0)
begin
set @ENTRYAMOUNTFIELD = dbo.[UFN_MKTSEGMENTATIONASKLADDER_ENTRYAMOUNT](@ASKLADDERID, 'EA', @FIELDNAME);
set @ENTRYAMOUNTJOINSQL = dbo.[UFN_MKTSEGMENTATIONASKLADDER_JOINSQL](@ASKLADDERID, @DATATABLE, 'DONORID', 'DT', 'EA', @TABLENAME, @PKFIELDNAME);
set @SQL = 'update dbo.[' + @DATATABLE + '] set' + char(13) +
' [ASKLADDERID] = @ASKLADDERID,' + char(13) +
' [ENTRYAMOUNT] = ' + @ENTRYAMOUNTFIELD + char(13) +
'from dbo.[' + @DATATABLE + '] as [DT]' + char(13) +
'inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [DT].[SEGMENTID]' + char(13);
if @ENTRYAMOUNTJOINSQL is not null
set @SQL += @ENTRYAMOUNTJOINSQL + char(13);
set @SQL += 'where [MKTSEGMENTATIONSEGMENT].[ASKLADDERID] = @ASKLADDERID' + char(13) +
'and [DT].[TESTSEGMENTID] is null' + char(13) +
'and [DT].[ASKLADDERID] is null' + char(13);
exec sp_executesql @SQL, N'@ASKLADDERID uniqueidentifier', @ASKLADDERID = @ASKLADDERID;
fetch next from SEGMENTCURSOR into @ASKLADDERID, @TABLENAME, @PKFIELDNAME, @FIELDNAME;
end
close SEGMENTCURSOR;
deallocate SEGMENTCURSOR;
--Test segments: Update the ASKLADDERID and ENTRYAMOUNT...
declare TESTSEGMENTCURSOR cursor local fast_forward for
select distinct
[ASKLADDERS].[ASKLADDERID],
[MF].[OBJECTNAME],
[MF].[PRIMARYKEYFIELD],
[MF].[NAME]
from @ASKLADDERS as [ASKLADDERS]
inner join dbo.[MKTASKLADDER] on [MKTASKLADDER].[ID] = [ASKLADDERS].[ASKLADDERID]
left join @MONEYFIELDS as [MF] on [MF].[RECORDSOURCEID] = [ASKLADDERS].[RECORDSOURCEID] and [MF].[OBJECTKEY] = [MKTASKLADDER].[OBJECTKEY]
inner join dbo.[MKTSEGMENTATIONTESTSEGMENT] on [MKTSEGMENTATIONTESTSEGMENT].[ASKLADDERID] = [ASKLADDERS].[ASKLADDERID]
inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID]
where [ASKLADDERS].[ISTESTSEGMENT] = 1
and [MKTSEGMENTATIONSEGMENT].[SEGMENTATIONID] = @SEGMENTATIONID
and [MKTSEGMENTATIONSEGMENT].[EXCLUDE] = 0;
open TESTSEGMENTCURSOR;
fetch next from TESTSEGMENTCURSOR into @ASKLADDERID, @TABLENAME, @PKFIELDNAME, @FIELDNAME;
while (@@FETCH_STATUS = 0)
begin
set @ENTRYAMOUNTFIELD = dbo.[UFN_MKTSEGMENTATIONASKLADDER_ENTRYAMOUNT](@ASKLADDERID, 'EA', @FIELDNAME);
set @ENTRYAMOUNTJOINSQL = dbo.[UFN_MKTSEGMENTATIONASKLADDER_JOINSQL](@ASKLADDERID, @DATATABLE, 'DONORID', 'DT', 'EA', @TABLENAME, @PKFIELDNAME);
set @SQL = 'update dbo.[' + @DATATABLE + '] set' + char(13) +
' [ASKLADDERID] = @ASKLADDERID,' + char(13) +
' [ENTRYAMOUNT] = ' + @ENTRYAMOUNTFIELD + char(13) +
'from dbo.[' + @DATATABLE + '] as [DT]' + char(13) +
'inner join dbo.[MKTSEGMENTATIONTESTSEGMENT] on [MKTSEGMENTATIONTESTSEGMENT].[ID] = [DT].[TESTSEGMENTID]' + char(13);
if @ENTRYAMOUNTJOINSQL is not null
set @SQL += @ENTRYAMOUNTJOINSQL + char(13);
set @SQL += 'where [MKTSEGMENTATIONTESTSEGMENT].[ASKLADDERID] = @ASKLADDERID' + char(13) +
'and [DT].[ASKLADDERID] is null' + char(13);
exec sp_executesql @SQL, N'@ASKLADDERID uniqueidentifier', @ASKLADDERID = @ASKLADDERID;
fetch next from TESTSEGMENTCURSOR into @ASKLADDERID, @TABLENAME, @PKFIELDNAME, @FIELDNAME;
end
close TESTSEGMENTCURSOR;
deallocate TESTSEGMENTCURSOR;
end try
begin catch
exec dbo.[USP_RAISE_ERROR];
return 1;
end catch
return 0;