USP_MKTCOMMUNICATIONEFFORT_GETUNIQUENAME
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@COMMUNICATIONNAMESCHEMEID | uniqueidentifier | IN | |
@EFFORTNAMESCHEMETEXT | xml | IN | |
@EFFORTNAME | nvarchar(100) | INOUT | |
@COUNTERVALUE | nvarchar(10) | INOUT | |
@COUNTER | int | INOUT | |
@SEGMENTATIONID | uniqueidentifier | IN | |
@ISCOPY | bit | IN | |
@NAMEFORMAT | nvarchar(100) | IN |
Definition
Copy
CREATE procedure dbo.[USP_MKTCOMMUNICATIONEFFORT_GETUNIQUENAME]
(
@COMMUNICATIONNAMESCHEMEID uniqueidentifier,
@EFFORTNAMESCHEMETEXT xml,
@EFFORTNAME nvarchar(100) output,
@COUNTERVALUE nvarchar(10) output,
@COUNTER int output,
@SEGMENTATIONID uniqueidentifier = null,
@ISCOPY bit = 0,
@NAMEFORMAT nvarchar(100) = '{0}{1}'
)
as
begin
set nocount on;
declare @TMPEFFORTNAME nvarchar(max);
declare @COUNTERFORMAT nvarchar(10);
declare @OLDEFFORTNAME nvarchar(100);
declare @NAMESCHEMEPARTSTABLE table (
[TEXTPART] nvarchar(100),
[FREEFORMPART] nvarchar(100),
[SEQUENCE] int,
[ID] uniqueidentifier,
[NAMEPARTTYPECODE] tinyint
);
begin try
if @SEGMENTATIONID is not null
select @OLDEFFORTNAME = [MKTSEGMENTATION].[NAME]
from dbo.[MKTSEGMENTATION]
where [MKTSEGMENTATION].[ID] = @SEGMENTATIONID;
--place the namescheme data into a table variable
if @COMMUNICATIONNAMESCHEMEID is not null
begin
insert into @NAMESCHEMEPARTSTABLE
select
case when T.c.value('(@SEPARATORTYPECODE)[1]', 'tinyint') = 1 then ' ' else T.c.value('(@TEXTPART)[1]', 'nvarchar(100)') end as [TEXTPART],
T.c.value('(@FREEFORMPART)[1]', 'nvarchar(100)') as [FREEFORMPART],
T.c.value('(@SEQUENCE)[1]', 'int') as [SEQUENCE],
@COMMUNICATIONNAMESCHEMEID,
T.c.value('(@NAMEPARTTYPECODE)[1]', 'tinyint') as [NAMEPARTTYPECODE]
from @EFFORTNAMESCHEMETEXT.nodes('/EFFORTNAMESCHEMETEXT/ITEM') T(c);
end
if @ISCOPY = 0 or @SEGMENTATIONID is null or (@OLDEFFORTNAME is not null and (@OLDEFFORTNAME <> @EFFORTNAME))
begin
--get the correct counter as needed
if exists(select 1 from @NAMESCHEMEPARTSTABLE where [NAMEPARTTYPECODE] = 8)
begin
--namescheme has counter
--get the next counter value
if @SEGMENTATIONID is null--counter start value is grabbed from the table
select
@COUNTER =
isnull(case when isnull([MKTCOMMUNICATIONNAMESCHEME].[MAXCOUNTERVALUE], 0) >= [MKTCOMMUNICATIONNAMESCHEMEPART].[VALUE] then isnull([MKTCOMMUNICATIONNAMESCHEME].[MAXCOUNTERVALUE], 0) + 1
else [MKTCOMMUNICATIONNAMESCHEMEPART].[VALUE] end, 1),
@COUNTERFORMAT = [MKTCOMMUNICATIONNAMESCHEMEPART].[OPTIONTYPE]
from dbo.[MKTCOMMUNICATIONNAMESCHEME]
left join dbo.[MKTCOMMUNICATIONNAMESCHEMEPART] on [MKTCOMMUNICATIONNAMESCHEME].[ID] = [MKTCOMMUNICATIONNAMESCHEMEPART].[MKTCOMMUNICATIONNAMESCHEMEID] and [MKTCOMMUNICATIONNAMESCHEMEPART].[NAMEPARTTYPECODE] = 8
where [MKTCOMMUNICATIONNAMESCHEME].[ID] = @COMMUNICATIONNAMESCHEMEID;
else --counter start value is assumed to be what is currently in the name
begin
select @COUNTER = [TEXTPART]
from @NAMESCHEMEPARTSTABLE
where [NAMEPARTTYPECODE] = 8;
select @COUNTERFORMAT = [MKTCOMMUNICATIONNAMESCHEMEPART].[OPTIONTYPE]
from dbo.[MKTCOMMUNICATIONNAMESCHEME]
left join dbo.[MKTCOMMUNICATIONNAMESCHEMEPART] on [MKTCOMMUNICATIONNAMESCHEME].[ID] = [MKTCOMMUNICATIONNAMESCHEMEPART].[MKTCOMMUNICATIONNAMESCHEMEID] and [MKTCOMMUNICATIONNAMESCHEMEPART].[NAMEPARTTYPECODE] = 8
where [MKTCOMMUNICATIONNAMESCHEME].[ID] = @COMMUNICATIONNAMESCHEMEID;
end
--if the number is already longer than the format we do not need to format it
if len(@COUNTER) > len(@COUNTERFORMAT)
set @COUNTERVALUE = cast(@COUNTER as nvarchar(10));
else
set @COUNTERVALUE = right(replicate('0',len(@COUNTERFORMAT)-1)+ rtrim(@COUNTER), len(@COUNTERFORMAT));
--now rebuild the effort's name
set @TMPEFFORTNAME = dbo.[UFN_MKTCOMMUNICATIONEFFORT_GETNAMEFROMNAMESCHEMETEXT](@EFFORTNAMESCHEMETEXT, @COUNTERVALUE);
declare @LOOPS int = 0;
while (select count(1) from dbo.[MKTSEGMENTATION] where [MKTSEGMENTATION].[NAME] = @TMPEFFORTNAME) > 0
begin
set @COUNTER = @COUNTER + 1;
if len(@COUNTER) > len(@COUNTERFORMAT)
set @COUNTERVALUE = cast(@COUNTER as nvarchar(10));
else
set @COUNTERVALUE = right(replicate('0',len(@COUNTERFORMAT)-1)+ rtrim(@COUNTER), len(@COUNTERFORMAT));
--now rebuild the effort's name
set @TMPEFFORTNAME = dbo.[UFN_MKTCOMMUNICATIONEFFORT_GETNAMEFROMNAMESCHEMETEXT](@EFFORTNAMESCHEMETEXT, @COUNTERVALUE);
if @COUNTER = 2147483647
begin
set @COUNTER = 0;
set @LOOPS = @LOOPS + 1;
if @LOOPS = 2
raiserror('ERR_COMMUNICATIONEFFORT_UNABLETOFINDUNIQUECOUNTER', 13, 1);
end
end
if len(@TMPEFFORTNAME) > 100
raiserror('ERR_COMMUNICATIONEFFORT_NAMESCHEMETEXTTOOLONG', 13, 1);
else
set @EFFORTNAME = @TMPEFFORTNAME;
end
else
--name pattern does NOT have a counter or they do not have a namescheme so we need to make sure the name is unique
exec dbo.[USP_MKTCOMMON_GETUNIQUENAME] @EFFORTNAME output, @NAMEFORMAT, 'MKTSEGMENTATION', 'NAME', @COUNTER output;
end
end try
begin catch
exec dbo.[USP_RAISE_ERROR];
return 1;
end catch
return 0;
end