USP_CREATEORUPDATE_BUILDNAMEFORMATTVF

This functions creates or updates the table value function used to represent a name format.

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_CREATEORUPDATE_BUILDNAMEFORMATTVF
(
    @ID uniqueidentifier, -- NAMEFORMATFUNCTION.ID,

    @CHANGEAGENTID uniqueidentifier = null
)
with execute as caller
as
    set nocount on;

    if @CHANGEAGENTID is null  
        exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output

    declare @CURRENTDATE datetime
    set @CURRENTDATE = getdate()

    begin try
        declare @SQL nvarchar(max);
        declare @SQL_SELECT nvarchar(max) = '';
        declare @SQL_FROM nvarchar(max);
        declare @SPOUSETABLE_INCLUDED bit = 0;      -- used for spouse information, typecode: 6,7,8,9,10


        declare @NAMEFORMAT_TVF nvarchar(200) = 'UFN_NAMEFORMAT_' + replace(cast(@ID as nvarchar(36)), '-', '_') + '_TVF';
        declare @CREATEORALTER nvarchar(7);

        if exists(select object_id from sys.objects where type = 'IF' and name = @NAMEFORMAT_TVF)
            set @CREATEORALTER = 'alter ';
        else
            set @CREATEORALTER = 'create ';

        set @SQL = @CREATEORALTER + 'function dbo.' + @NAMEFORMAT_TVF + '(@CONSTITUENTID uniqueidentifier)' + char(10);
        set @SQL = @SQL + 'returns table' + char(10);
        set @SQL = @SQL + '/*This code was auto-generated by calling dbo.USP_CREATEORUPDATE_BUILDNAMEFORMATTVF on ' + cast(getdate() as nvarchar) + '.  */' + char(10);
        set @SQL = @SQL + 'as' + char(10) + 'return' + char(10) + '(' + nchar(10) + 'select' + char(10);

        set @SQL_FROM = 'from dbo.CONSTITUENT with(nolock)' + char(10);

        declare @FIELDS table
        (
            [REMOVETRAILINGSPACE] bit,
            [INITIAL] bit,
            [SMARTREMOVE] bit,
            [ID] uniqueidentifier,
            [FIELDCODE] tinyint,
            [SPECIFIEDTABLEVALUEFUNCTION] nvarchar(100),
            [INDEX] int,
            [FIELDNAME] nvarchar(200)
        )
        insert into @FIELDS
        select 
            NAMEFORMATFUNCTIONDETAIL.REMOVETRAILINGSPACE,
            NAMEFORMATFUNCTIONDETAIL.INITIAL,
            NAMEFORMATFUNCTIONDETAIL.SMARTREMOVE,
            NAMEFORMATFIELD.ID,
            NAMEFORMATFIELD.FIELDCODE,
            NAMEFORMATFIELD.SPECIFIEDTABLEVALUEFUNCTION,
            ROW_NUMBER() over (order by NAMEFORMATFUNCTIONDETAIL.SEQUENCE desc),
            case NAMEFORMATFIELD.FIELDCODE
                when 0 then '''' + replace(NAMEFORMATFIELD.DISPLAY, '''', '''''') + ''''
                when 1 then 'CONSTITUENT.KEYNAME'
                when 2 then 'CONSTITUENT.FIRSTNAME'
                when 3 then 'CONSTITUENT.MIDDLENAME'
                when 6 then 'SPOUSE.KEYNAME'
                when 7 then 'SPOUSE.FIRSTNAME'
                when 8 then 'SPOUSE.MIDDLENAME'
                else case when NAMEFORMATFIELD.FIELDCODE = 11 then
                    case NAMEFORMATFIELD.SPECIFIEDTABLEVALUEFUNCTION
                        when 'dbo.UFN_CONSTITUENT_GETNICKNAME_TVF' then 'CONSTITUENT.NICKNAME'
                        when 'dbo.UFN_CONSTITUENT_GETMAIDENNAME_TVF' then 'CONSTITUENT.MAIDENNAME'
                        when 'dbo.UFN_CONSTITUENT_GETSPOUSENICKNAME_TVF' then 'SPOUSE.NICKNAME'
                        when 'dbo.UFN_CONSTITUENT_GETSPOUSEMAIDENNAME_TVF' then 'SPOUSE.MAIDENNAME'
                        else 'F' + cast(ROW_NUMBER() over (order by NAMEFORMATFUNCTIONDETAIL.SEQUENCE desc) as nvarchar(9)) +
                            case when NAMEFORMATFIELD.SPECIFIEDTABLEVALUEFUNCTION in (
                                                                                        'dbo.UFN_CONSTITUENT_GETTITLE2_TVF',
                                                                                        'dbo.UFN_CONSTITUENT_GETSUFFIX2_TVF',
                                                                                        'dbo.UFN_CONSTITUENT_GETSPOUSETITLE2_TVF',
                                                                                        'dbo.UFN_CONSTITUENT_GETSPOUSESUFFIX2_TVF'
                                                                                     )
                                then '.DESCRIPTION'
                                else '.VALUE'
                            end
                    end
                    else 'F' + cast(ROW_NUMBER() over (order by NAMEFORMATFUNCTIONDETAIL.SEQUENCE desc) as nvarchar(9)) + '.DESCRIPTION'
                end
            end
        from dbo.NAMEFORMATFUNCTIONDETAIL
            inner join dbo.NAMEFORMATFIELD on NAMEFORMATFUNCTIONDETAIL.NAMEFORMATFIELDID = NAMEFORMATFIELD.ID
        where
            NAMEFORMATFUNCTIONDETAIL.NAMEFORMATFUNCTIONID = @ID
        order by
            NAMEFORMATFUNCTIONDETAIL.SEQUENCE desc;

        declare @FIELDCOUNT int = @@ROWCOUNT
        declare @ROW int = 1

        declare @REMOVETRAILINGSPACE bit;
        declare @INITIAL bit;
        declare @SMARTREMOVE bit;
        declare @NAMEFORMATFIELDID uniqueidentifier;
        declare @FIELDCODE int;
        declare @SPECIFIEDTABLEVALUEFUNCTION nvarchar(100);

        declare @FIELD_TABLEALIAS nvarchar(10) = null;
        declare @FIELD_FROM nvarchar(max);     -- Used when including additional tables for field.


        declare @FIELDNAME nvarchar(200) = null;

        declare @PREVIOUSFIELDNAME nvarchar(200);
        declare @NEXTFIELDNAME nvarchar(200);

        declare @INCLUDESPOUSE bit = 0;

        -- Note we walk reverse to simplify handling of spacing and smart remove

        while @ROW <= @FIELDCOUNT begin
            select 
                @REMOVETRAILINGSPACE = REMOVETRAILINGSPACE,
                @INITIAL = INITIAL,
                @SMARTREMOVE = SMARTREMOVE,
                @NAMEFORMATFIELDID = ID,
                @FIELDCODE = FIELDCODE,
                @SPECIFIEDTABLEVALUEFUNCTION = SPECIFIEDTABLEVALUEFUNCTION,
                @FIELD_FROM = '',
                @FIELD_TABLEALIAS = 'F' + cast(@ROW as nvarchar(9)),
                @FIELDNAME = FIELDNAME,
                @PREVIOUSFIELDNAME =
                    case when SMARTREMOVE != 0
                        then (select FIELDNAME from @FIELDS where @ROW - 1 = [INDEX] and FIELDCODE != 0)
                        else null
                    end,
                @NEXTFIELDNAME =
                    case when SMARTREMOVE != 0
                        then (select FIELDNAME from @FIELDS where @ROW + 1 = [INDEX] and FIELDCODE != 0)
                        else null
                    end
            from @FIELDS
            where @ROW = [INDEX]

            if @FIELDCODE = 4
                begin
                    set @FIELD_FROM = '     left outer join dbo.TITLECODE ' + @FIELD_TABLEALIAS + ' with(nolock) on ' + @FIELD_TABLEALIAS +'.ID = CONSTITUENT.TITLECODEID' + char(10);
                end
            else if @FIELDCODE = 5
                begin
                    set @FIELD_FROM = '     left outer join dbo.SUFFIXCODE ' + @FIELD_TABLEALIAS + ' with(nolock) on ' + @FIELD_TABLEALIAS +'.ID = CONSTITUENT.SUFFIXCODEID' + char(10);
                end
            else if @FIELDCODE = 9
                begin
                    set @FIELD_FROM = '     left outer join dbo.TITLECODE ' + @FIELD_TABLEALIAS + ' with(nolock) on ' + @FIELD_TABLEALIAS +'.ID = SPOUSE.TITLECODEID' + char(10);
                end
            else if @FIELDCODE = 10
                begin
                    set @FIELD_FROM = '     left outer join dbo.SUFFIXCODE ' + @FIELD_TABLEALIAS + ' with(nolock) on ' + @FIELD_TABLEALIAS +'.ID = SPOUSE.SUFFIXCODEID' + char(10);
                end
            else if @FIELDCODE = 11
                begin
                    if @SPECIFIEDTABLEVALUEFUNCTION is null or @SPECIFIEDTABLEVALUEFUNCTION = ''
                    begin
                        raiserror('ERR_NAMEFORMAT_SPECIFIEDTABLEVALUEFUNCTION_MISSING', 13, 1);
                        return -1
                    end

        -- If this field is one of the standard misidentified constituent fields, then optimize the SQL.

                    -- Since there is no good way to identify the fields, look for the UFNs we replace

                    if @SPECIFIEDTABLEVALUEFUNCTION = 'dbo.UFN_CONSTITUENT_GETTITLE2_TVF'
                        begin
                            set @FIELD_FROM = '     left outer join dbo.TITLECODE ' + @FIELD_TABLEALIAS + ' with(nolock) on ' + @FIELD_TABLEALIAS +'.ID = CONSTITUENT.TITLE2CODEID' + char(10);
                        end
                    else if @SPECIFIEDTABLEVALUEFUNCTION = 'dbo.UFN_CONSTITUENT_GETSUFFIX2_TVF'
                        begin
                            set @FIELD_FROM = '     left outer join dbo.SUFFIXCODE ' + @FIELD_TABLEALIAS + ' with(nolock) on ' + @FIELD_TABLEALIAS +'.ID = CONSTITUENT.SUFFIX2CODEID' + char(10);
                        end
                    else if @SPECIFIEDTABLEVALUEFUNCTION = 'dbo.UFN_CONSTITUENT_GETSPOUSETITLE2_TVF'
                        begin
                            set @INCLUDESPOUSE = 1;
                            set @FIELD_FROM = '     left outer join dbo.TITLECODE ' + @FIELD_TABLEALIAS + ' with(nolock) on ' + @FIELD_TABLEALIAS +'.ID = SPOUSE.TITLE2CODEID' + char(10);
                        end
                    else if @SPECIFIEDTABLEVALUEFUNCTION = 'dbo.UFN_CONSTITUENT_GETSPOUSESUFFIX2_TVF'
                        begin
                            set @INCLUDESPOUSE = 1;
                            set @FIELD_FROM = '     left outer join dbo.SUFFIXCODE ' + @FIELD_TABLEALIAS + ' with(nolock) on ' + @FIELD_TABLEALIAS +'.ID = SPOUSE.SUFFIX2CODEID' + char(10);
                        end
                    else if @SPECIFIEDTABLEVALUEFUNCTION not in (
                                                                    'dbo.UFN_CONSTITUENT_GETNICKNAME_TVF',
                                                                    'dbo.UFN_CONSTITUENT_GETMAIDENNAME_TVF',
                                                                    'dbo.UFN_CONSTITUENT_GETSPOUSENICKNAME_TVF',
                                                                    'dbo.UFN_CONSTITUENT_GETSPOUSEMAIDENNAME_TVF'
                                                                )
                        begin
                            set @FIELD_FROM = '     outer apply ' + @SPECIFIEDTABLEVALUEFUNCTION + '(CONSTITUENT.ID) ' + @FIELD_TABLEALIAS + char(10);
                        end
                end
            else if @FIELDCODE > 11
                begin
                    raiserror('ERR_NAMEFORMAT_UNSUPPORTEDFIELDCODE', 13, 1);
                    return -1
                end

            set @SQL_SELECT = '     ' +
                -- If this isn't a constant, check for null and empty

                case when @FIELDCODE != 0
                    then
                        'case when len(coalesce(' + @FIELDNAME + ', '''')) = 0' +

                        -- Account for smart remove, if next field is blank, don't include this one.

                        case when @SMARTREMOVE != 0 and @PREVIOUSFIELDNAME is not null
                            then ' or len(coalesce(' + @PREVIOUSFIELDNAME + ', '''')) = 0'
                            else ''
                            end +
                        case when @SMARTREMOVE != 0 and @NEXTFIELDNAME is not null
                            then ' or len(coalesce(' + @NEXTFIELDNAME + ', '''')) = 0'
                            else ''
                            end + ' then '''' else '
                    else case when @SMARTREMOVE != 0 and (@PREVIOUSFIELDNAME is not null or @NEXTFIELDNAME is not null)
                            then 'case when ' +
                                case when @PREVIOUSFIELDNAME is not null
                                    then 'len(coalesce(' + @PREVIOUSFIELDNAME + ', '''')) = 0'
    else ''
                                end +
                                case when (@PREVIOUSFIELDNAME is not null and @NEXTFIELDNAME is not null)
                                    then ' or '
                                    else ''
                                end +
                                case when @NEXTFIELDNAME is not null
                                    then 'len(coalesce(' + @NEXTFIELDNAME + ', '''')) = 0'
                                    else ''
                                end + ' then '''' else '
                            else ''
                            end
                end +

                -- DO NOT CALL dbo.UFN_MAKEINITIALS,

                -- unrolling and simplifying the UFN is extremely important to performance

                case when @INITIAL != 0
                    then
                        'left (' + @FIELDNAME + ', 1) + ''.'''
                    else @FIELDNAME
                end +

                -- Append spacer

                case when (@ROW > 1 and @REMOVETRAILINGSPACE = 0)
                    then ' + '' '''
                    else ''
                end +

                -- If this isn't a constant, close the clause

                case when (@FIELDCODE != 0 or (@SMARTREMOVE != 0 and (@PREVIOUSFIELDNAME is not null or @NEXTFIELDNAME is not null)))
                    then
                        ' end'
                    else ''
                end +

                -- Append concatenation logic

                case when @ROW > 1
                    then ' + '
                    else ''
                end + char(10) + @SQL_SELECT;

            -- Depending on the field type add field's table to the from clause

            if (@INCLUDESPOUSE != 0 or @FIELDCODE in (6,7,8,9,10)) and @SPOUSETABLE_INCLUDED = 0
            begin
                set @SPOUSETABLE_INCLUDED = 1;
                set @SQL_FROM = @SQL_FROM + '     left outer join dbo.RELATIONSHIP with(nolock) on CONSTITUENT.ID = RELATIONSHIP.RELATIONSHIPCONSTITUENTID and RELATIONSHIP.ISSPOUSE = 1' + char(10);
                set @SQL_FROM = @SQL_FROM + '     left outer join dbo.DECEASEDCONSTITUENT with(nolock) on DECEASEDCONSTITUENT.ID = RELATIONSHIP.RECIPROCALCONSTITUENTID' + char(10);
                set @SQL_FROM = @SQL_FROM + '     left outer join dbo.CONSTITUENT as SPOUSE with(nolock) on SPOUSE.ID = RELATIONSHIP.RECIPROCALCONSTITUENTID and SPOUSE.ISINACTIVE = 0 and DECEASEDCONSTITUENT.ID is null' + char(10);
            end

            set @SQL_FROM = @SQL_FROM + @FIELD_FROM;
            set @ROW = @ROW + 1;
        end

        -- If the name format was not defined by the user, no meta data exists to build the TVF dynamically

        if (@FIELD_TABLEALIAS is null)
        begin
            raiserror('ERR_NAMEFORMAT_FUNCTIONDETAILS_MISSING', 13, 1);
            return -1;
        end

        set @SQL = @SQL + '     rtrim(ltrim(' + char(10) + @SQL_SELECT + ')) as NAME' + char(10) + @SQL_FROM;

        set @SQL = @SQL + 'where' + char(10);
        set @SQL = @SQL + '     (@CONSTITUENTID is null or @CONSTITUENTID = dbo.CONSTITUENT.ID)' + char(10);
        set @SQL = @SQL + ')' + char(10);

        exec (@SQL);
    end try

    begin catch
        -- Suppress errors, clear the TVF field.

        set @NAMEFORMAT_TVF = '';
    end catch

    update dbo.NAMEFORMATFUNCTION set
        FORMATSQLTABLEVALUEFUNCTION = @NAMEFORMAT_TVF,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
    where ID = @ID;

return 0