USP_MKTSEGMENTATION_TRUNCATEDATATABLE
Returns the package costs for a marketing effort.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SEGMENTATIONID | uniqueidentifier | IN |
Definition
Copy
CREATE procedure dbo.[USP_MKTSEGMENTATION_TRUNCATEDATATABLE]
(
@SEGMENTATIONID uniqueidentifier
)
as
set nocount on;
declare @MAILINGTYPECODE tinyint;
declare @DATATABLENAME nvarchar(128) = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME](@SEGMENTATIONID);
declare @SQL nvarchar(max);
declare @TRUNCATESUCCEEDED bit;
declare @RETRY tinyint;
declare @OLDDONORIDDATATYPE nvarchar(128);
declare @NEWDONORIDDATATYPE nvarchar(128);
select
@MAILINGTYPECODE = [MAILINGTYPECODE]
from dbo.[MKTSEGMENTATION]
where [ID] = @SEGMENTATIONID;
--For direct/appeal mailings only, check to see if the data type of the DONORID column changed (ie - can happen by adding a list segment to the mailing after adding RE7 house file segments)...
if @MAILINGTYPECODE = 0
begin
select
@OLDDONORIDDATATYPE = (case when lower([DATA_TYPE]) in ('nvarchar', 'varchar', 'char') then 'varchar(' + cast([CHARACTER_MAXIMUM_LENGTH] as nvarchar(10)) + ')' else [DATA_TYPE] end)
from [INFORMATION_SCHEMA].[COLUMNS]
where [TABLE_SCHEMA] = 'dbo'
and [TABLE_NAME] = @DATATABLENAME
and [COLUMN_NAME] = 'DONORID';
set @NEWDONORIDDATATYPE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_GETDONORIDDATATYPE](@SEGMENTATIONID);
end
if isnull(@OLDDONORIDDATATYPE, '') <> isnull(@NEWDONORIDDATATYPE, '')
begin
--The DONORID data type changed so we need to drop the table (if exists) and recreate it...
if exists(select * from [INFORMATION_SCHEMA].[TABLES] where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @DATATABLENAME)
begin
set @SQL = 'drop table dbo.[' + @DATATABLENAME + ']';
exec (@SQL);
end
exec dbo.[USP_MKTSEGMENTATIONACTIVATE_CREATEDATATABLE] @SEGMENTATIONID;
end
else
begin
if exists(select * from [INFORMATION_SCHEMA].[TABLES] where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @DATATABLENAME)
begin
-- try to recover from deadlocks when truncating the activated table by catching any deadlocks and keep retrying until
-- the table is truncated successfully
-- this will retry every 10 seconds for 180 times before it raises an error
set @TRUNCATESUCCEEDED = 0;
set @RETRY = 0;
set @SQL = 'truncate table dbo.[' + @DATATABLENAME + '];';
while (@TRUNCATESUCCEEDED = 0)
begin
begin try
exec (@SQL);
set @TRUNCATESUCCEEDED = 1;
end try
begin catch
if ERROR_NUMBER() = 1205 and @RETRY < 180
begin
waitfor delay '00:00:10';
set @RETRY = @RETRY + 1;
end
else
begin
exec dbo.USP_RAISE_ERROR;
return 1;
end
end catch
end
-- drop indexes created in USP_MKTSEGMENTATIONACTIVATE_ACTIVATE
set @SQL = 'if exists(select * from dbo.sysindexes where name = ''IX_' + @DATATABLENAME + '_SEGMENTID'')' + char(13) +
' drop index [IX_' + @DATATABLENAME + '_SEGMENTID] on [dbo].[' + @DATATABLENAME + '];' + char(13) +
char(13) +
'if exists(select * from dbo.sysindexes where name = ''IX_' + @DATATABLENAME + '_TESTSEGMENTID'')' + char(13) +
' drop index [IX_' + @DATATABLENAME + '_TESTSEGMENTID] on [dbo].[' + @DATATABLENAME + '];' + char(13) +
char(13) +
'if exists(select * from dbo.sysindexes where name = ''IX_' + @DATATABLENAME + '_SOURCECODE'')' + char(13) +
' drop index [IX_' + @DATATABLENAME + '_SOURCECODE] on [dbo].[' + @DATATABLENAME + '];' + char(13) +
char(13) +
'if exists(select * from dbo.sysindexes where name = ''IX_' + @DATATABLENAME + '_ASKLADDERID'')' + char(13) +
' drop index [IX_' + @DATATABLENAME + '_ASKLADDERID] on [dbo].[' + @DATATABLENAME + '];' + char(13) +
char(13) +
'if exists(select * from dbo.sysindexes where name = ''IX_' + @DATATABLENAME + '_TESTSEGMENTID_DONORID'')' + char(13) +
' drop index [IX_' + @DATATABLENAME + '_TESTSEGMENTID_DONORID] on [dbo].[' + @DATATABLENAME + '];' + char(13) +
char(13);
if dbo.[UFN_INSTALLEDPRODUCTS_PRODUCTIS]('BB9873D7-F1ED-430A-8AB4-F09F47056538') = 0
set @SQL += 'if exists(select * from dbo.sysindexes where name = ''IX_' + @DATATABLENAME + '_CONSTITUENTAPPEALID'')' + char(13) +
' drop index [IX_' + @DATATABLENAME + '_CONSTITUENTAPPEALID] on [dbo].[' + @DATATABLENAME + '];' + char(13) +
char(13);
-- restore FINDERNUMBER column to nullable state
set @SQL += 'if exists(select * from dbo.sysindexes where name = ''UIX_' + @DATATABLENAME + '_FINDERNUMBER'')' + char(13) +
' drop index [UIX_' + @DATATABLENAME + '_FINDERNUMBER] on dbo.[' + @DATATABLENAME + '];' + char(13) +
'alter table dbo.[' + @DATATABLENAME + '] alter column [FINDERNUMBER] bigint null;'
exec (@SQL);
end
end
--Since we are recalculating segment counts, we can delete any constituents we may have merged on-the-fly during an export-before-activate
--process for this mailing. This table does not have auditing, so we can just use the 'delete' statement here.
delete from dbo.[MKTSEGMENTATIONMERGEDORIGINALCONSTITUENTS]
where [SEGMENTATIONID] = @SEGMENTATIONID;
return 0;