UFN_MKTSOURCECODE_BUILDCODEWITHSEGMENTINFO

Builds the full source code for a given segment ID, making use of the given segment info.

Return

Return Type
nvarchar(50)

Parameters

Parameter Parameter Type Mode Description
@SEGMENTATIONSEGMENTID uniqueidentifier IN
@SEGMENTATIONID uniqueidentifier IN
@SEGMENTATIONACTIVE bit IN
@SOURCECODEID uniqueidentifier IN
@SOURCECODEMAXSEQUENCE tinyint IN
@LISTCODE nvarchar(10) IN
@LISTPARTDEFINITIONVALUESID uniqueidentifier IN
@ISCONSOLIDATEDSEGMENT bit IN
@SOURCECODEITEMID uniqueidentifier IN

Definition

Copy


CREATE function dbo.[UFN_MKTSOURCECODE_BUILDCODEWITHSEGMENTINFO]
(
    @SEGMENTATIONSEGMENTID uniqueidentifier,
    @SEGMENTATIONID uniqueidentifier,
    @SEGMENTATIONACTIVE bit,
    @SOURCECODEID uniqueidentifier,
    @SOURCECODEMAXSEQUENCE tinyint,
    @LISTCODE nvarchar(10),
    @LISTPARTDEFINITIONVALUESID uniqueidentifier,
    @ISCONSOLIDATEDSEGMENT bit,
    @SOURCECODEITEMID uniqueidentifier
)
returns nvarchar(50)
as
    begin
        declare @DELIM nvarchar(1);
        declare @SOURCECODE nvarchar(50) = '';

        declare @PACKAGEID uniqueidentifier;
        declare @CHANNELCODE tinyint;
        declare @SEGMENTID uniqueidentifier;

        declare @ITEMID uniqueidentifier;
        declare @TYPECODE tinyint;
        declare @LENGTH tinyint;
        declare @SOURCECODEPARTDEFINITIONID uniqueidentifier;
        declare @SEQUENCE tinyint;

        declare @EXCLUDE bit = 0;
        declare @ISTESTSEGMENT bit = 0;

        select
            @EXCLUDE = [EXCLUDE]
        from dbo.[MKTSEGMENTATIONSEGMENT]
        where [ID] = @SEGMENTATIONSEGMENTID;

        -- no source code ID means we've got nothing to do

        -- inline exclusions have no source code

        if @SOURCECODEID is not null and isnull(@EXCLUDE, 0) = 0
            begin
                -- try to get a test segment and its info

                select
                    @PACKAGEID = [MKTSEGMENTATIONTESTSEGMENT].[PACKAGEID],
                    @CHANNELCODE = [MKTPACKAGE].[CHANNELCODE],
                    @SEGMENTID = [MKTSEGMENTATIONSEGMENT].[SEGMENTID],
                    @ISTESTSEGMENT = 1
                from dbo.[MKTSEGMENTATIONTESTSEGMENT]
                inner join dbo.[MKTSEGMENTATIONSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID]
                inner join dbo.[MKTPACKAGE] on [MKTPACKAGE].[ID] = [MKTSEGMENTATIONSEGMENT].[PACKAGEID]
                where [MKTSEGMENTATIONTESTSEGMENT].[ID] = @SEGMENTATIONSEGMENTID;

                -- if we can't get a test segment, we are dealing with a regular segment

                if @ISTESTSEGMENT <> 1
                    select
                        @PACKAGEID = [MKTSEGMENTATIONSEGMENT].[PACKAGEID],
                        @CHANNELCODE = [MKTPACKAGE].[CHANNELCODE],
                        @SEGMENTID = [MKTSEGMENTATIONSEGMENT].[SEGMENTID],
                        @ISTESTSEGMENT = 0
                    from dbo.[MKTSEGMENTATIONSEGMENT]
                    inner join dbo.[MKTPACKAGE] on [MKTPACKAGE].[ID] = [MKTSEGMENTATIONSEGMENT].[PACKAGEID]
                    where [MKTSEGMENTATIONSEGMENT].[ID] = @SEGMENTATIONSEGMENTID;

                declare @PARTDEFINITIONVALUESID uniqueidentifier;
                declare @DEFAULTUSERDEFINEDCODE nvarchar(50);
                declare @USEDEFAULTUSERDEFINEDCODE bit;

                -- we will be iterating over each part in the given source code

                declare PARTCURSOR cursor local fast_forward for
                select
                    [MKTSOURCECODEITEM].[ID], 
                    [MKTSOURCECODEPARTDEFINITION].[ITEMTYPECODE], 
                    [MKTSOURCECODEITEM].[LENGTH],
                    [MKTSOURCECODEITEM].[MKTSOURCECODEPARTDEFINITIONID],
                    [MKTSOURCECODEITEM].[SEQUENCE]
                from dbo.[MKTSOURCECODEITEM]
                inner join dbo.[MKTSOURCECODEPARTDEFINITION] on [MKTSOURCECODEPARTDEFINITION].[ID] = [MKTSOURCECODEITEM].[MKTSOURCECODEPARTDEFINITIONID]
                where [SOURCECODEID] = @SOURCECODEID
                and (@SOURCECODEITEMID is null or [MKTSOURCECODEITEM].[ID] = @SOURCECODEITEMID)
                order by [SEQUENCE];

                open PARTCURSOR;
                fetch next from PARTCURSOR into @ITEMID, @TYPECODE, @LENGTH, @SOURCECODEPARTDEFINITIONID, @SEQUENCE;

                while (@@FETCH_STATUS = 0)
                    begin
                        set @PARTDEFINITIONVALUESID = null;
                        set @DEFAULTUSERDEFINEDCODE = '';

                        --Adding local parameters to avoid parameter sniffing

                        declare @LOCALITEMID uniqueidentifier = @ITEMID;
                        declare @LOCALSEGMENTATIONID uniqueidentifier = @SEGMENTATIONID;
                        declare @LOCALSEGMENTATIONSEGMENTID uniqueidentifier = @SEGMENTATIONSEGMENTID;

                        -- if this is a user-defined part type, get default information

                        if @TYPECODE = 5 
                            begin
                                if @ISTESTSEGMENT = 0
                                    begin
                                        -- does this segment use the default

                                        set @USEDEFAULTUSERDEFINEDCODE = 
                                            case when exists (select top 1 1
                                                                                from dbo.[MKTSOURCECODEPART] 
                                                                                where [SEGMENTATIONID] = @LOCALSEGMENTATIONID 
                                                                                and [SOURCECODEITEMID] = @LOCALITEMID 
                                                                                and [SEGMENTATIONSEGMENTID] = @LOCALSEGMENTATIONSEGMENTID
                                                     then 0 else 1 end;

                                        -- get the value for the segment based on whether or not it uses the default

                                        if @USEDEFAULTUSERDEFINEDCODE = 1
                                            select
                                                @DEFAULTUSERDEFINEDCODE = [CODE],
                                                @PARTDEFINITIONVALUESID = [PARTDEFINITIONVALUESID]
                                            from dbo.[MKTSOURCECODEPART]
                                            where [SEGMENTATIONID] = @LOCALSEGMENTATIONID
                                            and [SOURCECODEITEMID] = @LOCALITEMID
                                            and [SEGMENTATIONSEGMENTID] is null
                                            and [SEGMENTATIONTESTSEGMENTID] is null
                                        else -- @USEDEFAULTUSERDEFINEDCODE = 0

                                            select
                                                @DEFAULTUSERDEFINEDCODE = [CODE],
                                                @PARTDEFINITIONVALUESID = [PARTDEFINITIONVALUESID]
                                            from dbo.[MKTSOURCECODEPART]
                                            where [SEGMENTATIONID] = @LOCALSEGMENTATIONID
                                            and [SOURCECODEITEMID] = @LOCALITEMID
                                            and [SEGMENTATIONSEGMENTID] = @LOCALSEGMENTATIONSEGMENTID
                                    end
                                else -- @ISTESTSEGMENT = 1

                                    begin
                                        -- does this test segment use the default

                                        set @USEDEFAULTUSERDEFINEDCODE = 
                                            case when exists (select top 1 1 
                                                                                from dbo.[MKTSOURCECODEPART] 
                                                                                where [SEGMENTATIONID] = @LOCALSEGMENTATIONID 
                                                                                and [SOURCECODEITEMID] = @LOCALITEMID 
                                                                                and [SEGMENTATIONTESTSEGMENTID] = @LOCALSEGMENTATIONSEGMENTID
                                                    then 0 else 1 end;

                                        -- get the value for the test segment based on whether or not it uses the default

                                        if @USEDEFAULTUSERDEFINEDCODE = 1
                                            select
                                                @DEFAULTUSERDEFINEDCODE = [CODE],
                                                @PARTDEFINITIONVALUESID = [PARTDEFINITIONVALUESID]
                                            from dbo.[MKTSOURCECODEPART]
                                            where [SEGMENTATIONID] = @LOCALSEGMENTATIONID
                                            and [SOURCECODEITEMID] = @LOCALITEMID
                                            and [SEGMENTATIONSEGMENTID] is null
                                            and [SEGMENTATIONTESTSEGMENTID] is null
                                        else -- @USEDEFAULTUSERDEFINEDCODE = 0

                                            select
                                                @DEFAULTUSERDEFINEDCODE = [CODE],
                                                @PARTDEFINITIONVALUESID = [PARTDEFINITIONVALUESID]
                                            from dbo.[MKTSOURCECODEPART]
                                            where [SEGMENTATIONID] = @LOCALSEGMENTATIONID
                                            and [SOURCECODEITEMID] = @LOCALITEMID
                                            and [SEGMENTATIONTESTSEGMENTID] = @LOCALSEGMENTATIONSEGMENTID                      
                                    end
                            end

                        if @PARTDEFINITIONVALUESID is null
                            begin
                                -- get the part definition values ID for itemtype if not already set

                                set @PARTDEFINITIONVALUESID =
                                    case when @TYPECODE = 0 then (select [PARTDEFINITIONVALUESID] from dbo.[MKTSEGMENTATION] where [ID] = @LOCALSEGMENTATIONID)
                                             when @TYPECODE = 1 then case @ISTESTSEGMENT
                                                                                                 when 1 then (select [MKTSEGMENTATIONSEGMENT].[PARTDEFINITIONVALUESID] from dbo.[MKTSEGMENTATIONSEGMENT] inner join dbo.[MKTSEGMENTATIONTESTSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID] where [MKTSEGMENTATIONTESTSEGMENT].[ID] = @SEGMENTATIONSEGMENTID)
                                else (select [PARTDEFINITIONVALUESID] from dbo.[MKTSEGMENTATIONSEGMENT] where [ID] = @LOCALSEGMENTATIONSEGMENTID
                                                                                             end
                                             when @TYPECODE = 2 and @SEGMENTATIONACTIVE = 0 then (select [PARTDEFINITIONVALUESID] from dbo.[MKTPACKAGE] where [ID] = @PACKAGEID)
                                             when @TYPECODE = 2 and @SEGMENTATIONACTIVE = 1 then (select [PARTDEFINITIONVALUESID] from dbo.[MKTSEGMENTATIONPACKAGE] where [SEGMENTATIONID] = @LOCALSEGMENTATIONID and [PACKAGEID] = @PACKAGEID)
                                             when @TYPECODE = 3 and @SEGMENTATIONACTIVE = 0 then (select [CHANNELPARTDEFINITIONVALUESID] from dbo.[MKTPACKAGE] where [ID] = @PACKAGEID)
                                             when @TYPECODE = 3 and @SEGMENTATIONACTIVE = 1 then (select [CHANNELPARTDEFINITIONVALUESID] from dbo.[MKTSEGMENTATIONPACKAGE] where [SEGMENTATIONID] = @LOCALSEGMENTATIONID and [PACKAGEID] = @PACKAGEID)
                                             when @TYPECODE = 6 then (select @LISTPARTDEFINITIONVALUESID)
                                             when @TYPECODE = 7 then case @ISTESTSEGMENT
                                                                                                 when 1 then (select [TESTPARTDEFINITIONVALUESID] from dbo.[MKTSEGMENTATIONTESTSEGMENT] where [ID] = @LOCALSEGMENTATIONSEGMENTID
                                                                                                 else (select [TESTPARTDEFINITIONVALUESID] from dbo.[MKTSEGMENTATIONSEGMENT] where [ID] = @LOCALSEGMENTATIONSEGMENTID)
                                                                                             end
                                    end
                            end

                        -- set true if value is a valid value for the given source code

                        declare @VALIDVALUE bit;
                        set @VALIDVALUE = 
                            case when exists (select top 1 1 
                                                                from dbo.[MKTSOURCECODEVALIDPARTVALUES]
                                                                inner join dbo.[MKTSOURCECODEITEM] on [MKTSOURCECODEITEM].[ID] = [MKTSOURCECODEVALIDPARTVALUES].[MKTSOURCECODEITEMID]
                                                                where [MKTSOURCECODEITEM].[SOURCECODEID] = @SOURCECODEID 
                                                                and [MKTSOURCECODEVALIDPARTVALUES].[MKTSOURCECODEPARTDEFINITIONVALUESID] = @PARTDEFINITIONVALUESID
                                    then 1 else 0 end;

                        -- appead the current source code part on the source code

                        set @SOURCECODE = 
                            @SOURCECODE 
                            + (select right(replicate('_', @LENGTH)
                                                            + case when @TYPECODE = 0 -- 0 = mailing

                                                                         then (select isnull([CODE], '') from dbo.[MKTSEGMENTATION] where [ID] = @LOCALSEGMENTATIONID
                                                                         when @TYPECODE = 1 and @SEGMENTATIONACTIVE = 0 and @VALIDVALUE = 1 -- 1 = segment or test segment

                                                                         then case @ISTESTSEGMENT
                                                                                        when 1 then (select isnull([MKTSEGMENTATIONSEGMENT].[CODE], '') from dbo.[MKTSEGMENTATIONSEGMENT] inner join dbo.[MKTSEGMENTATIONTESTSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID] where [MKTSEGMENTATIONTESTSEGMENT].[ID] = @SEGMENTATIONSEGMENTID)
                                                                                        else (select isnull([CODE], '') from dbo.[MKTSEGMENTATIONSEGMENT] where [ID] = @LOCALSEGMENTATIONSEGMENTID)
                                                                                    end
                                                                         when @TYPECODE = 1 and @SEGMENTATIONACTIVE = 1
                                                                         then case @ISTESTSEGMENT
                                                                                        when 1 then (select isnull([MKTSEGMENTATIONSEGMENT].[CODE], '') from dbo.[MKTSEGMENTATIONSEGMENT] inner join dbo.[MKTSEGMENTATIONTESTSEGMENT] on [MKTSEGMENTATIONSEGMENT].[ID] = [MKTSEGMENTATIONTESTSEGMENT].[SEGMENTID] where [MKTSEGMENTATIONTESTSEGMENT].[ID] = @SEGMENTATIONSEGMENTID)
                                                                                        else (select isnull([CODE], '') from dbo.[MKTSEGMENTATIONSEGMENT] where [ID] = @LOCALSEGMENTATIONSEGMENTID)
                                                                                    end
                                                                         when @TYPECODE = 2 and @SEGMENTATIONACTIVE = 0 and @VALIDVALUE = 1 -- 2 = package, inactive

                                                                         then (select isnull([CODE], '') from dbo.[MKTPACKAGE] where [ID] = @PACKAGEID)
                                                                         when (@TYPECODE = 2 and @SEGMENTATIONACTIVE = 1) -- 2 = package, active

                                                                         then (select isnull([CODE], '') from dbo.[MKTSEGMENTATIONPACKAGE] where [SEGMENTATIONID] = @LOCALSEGMENTATIONID and [PACKAGEID] = @PACKAGEID)
                                                                         when @TYPECODE = 3 and @SEGMENTATIONACTIVE = 0 and @VALIDVALUE = 1 -- 3 = channel, inactive

                                                                         then (select isnull([CHANNELSOURCECODE], '') from dbo.[MKTPACKAGE] where [ID] = @PACKAGEID)
                                                                         when @TYPECODE = 3 and @SEGMENTATIONACTIVE = 1 -- 3 = channel, active

                                                                         then (select isnull([CHANNELSOURCECODE], '') from dbo.[MKTSEGMENTATIONPACKAGE] where [SEGMENTATIONID] = @SEGMENTATIONID and [PACKAGEID] = @PACKAGEID)
                                                                         when @TYPECODE = 4 -- 4 = date

                                                                         then (select isnull([CODE], '') from dbo.[MKTSOURCECODEPART] where [SEGMENTATIONID] = @LOCALSEGMENTATIONID and [SOURCECODEITEMID] = @LOCALITEMID and [SEGMENTATIONSEGMENTID] = @LOCALSEGMENTATIONSEGMENTID)
                                                                         when @TYPECODE = 5 and @ISTESTSEGMENT = 0 -- 5 = user defined

                                                                         then case @USEDEFAULTUSERDEFINEDCODE
                                                                                        when 0 then (select isnull([MKTSOURCECODEPART].[CODE], '') from [MKTSOURCECODEPART] where [SEGMENTATIONID] = @LOCALSEGMENTATIONID and [SOURCECODEITEMID] = @LOCALITEMID and [SEGMENTATIONSEGMENTID] = @SEGMENTATIONSEGMENTID)
                                                                                        else @DEFAULTUSERDEFINEDCODE 
                                                                                    end
                                                                         when @TYPECODE = 5 and @ISTESTSEGMENT = 1
                                                                         then case @USEDEFAULTUSERDEFINEDCODE
                                                                                        when 0 then (select isnull([MKTSOURCECODEPART].[CODE], '') from [MKTSOURCECODEPART] where [SEGMENTATIONID] = @LOCALSEGMENTATIONID and [SOURCECODEITEMID] = @LOCALITEMID and [SEGMENTATIONTESTSEGMENTID] = @LOCALSEGMENTATIONSEGMENTID)
                                                                                        else @DEFAULTUSERDEFINEDCODE 
                                                                                    end
                                                                         when @TYPECODE = 6 and @ISCONSOLIDATEDSEGMENT = 1 -- 6 = list

                                                                         then '**********' -- consolidated list

                                                                         when @TYPECODE = 6 and @SEGMENTATIONACTIVE = 0 and @VALIDVALUE = 1
                                                                         then @LISTCODE
                                                                         when @TYPECODE = 6 and @SEGMENTATIONACTIVE = 1
                                                                         then @LISTCODE
                                                                         when @TYPECODE = 7 -- 7 = test segment

                                                                         then case @ISTESTSEGMENT
                                                                                        when 1 then (select isnull([TESTSEGMENTCODE], '') from dbo.[MKTSEGMENTATIONTESTSEGMENT] where [ID] = @LOCALSEGMENTATIONSEGMENTID)
                                                                                        else (select isnull([TESTSEGMENTCODE], '') from dbo.[MKTSEGMENTATIONSEGMENT] where [ID] = @LOCALSEGMENTATIONSEGMENTID)
                                                                                    end
                                                                         else replicate('_', @LENGTH)
                                                                end, @LENGTH))

                        -- add the part's delimiter, if needed

                        if @SEQUENCE < @SOURCECODEMAXSEQUENCE
                            select @SOURCECODE = @SOURCECODE + isnull([MKTSOURCECODEPARTDEFINITIONVALUES].[DELIM], '')
                            from dbo.[MKTSOURCECODEPARTDEFINITIONVALUES]
                            where [MKTSOURCECODEPARTDEFINITIONVALUES].[ID] = @PARTDEFINITIONVALUESID;

                        fetch next from PARTCURSOR into @ITEMID, @TYPECODE, @LENGTH, @SOURCECODEPARTDEFINITIONID, @SEQUENCE;
                    end

                close PARTCURSOR;
                deallocate PARTCURSOR;
            end

        return @SOURCECODE;
end