USP_CONSTITUENTSOURCEANALYSIS_UPDATESMARTFIELD

Updates the constituent source analysis cache with data calculated by a smart field.

Parameters

Parameter Parameter Type Mode Description
@CACHETABLENAME nvarchar(128) IN
@SMARTFIELDDISPLAYNAME nvarchar(100) IN
@DATATYPE nvarchar(20) IN
@CHANGEAGENTID uniqueidentifier IN
@CHANGEDATE datetime IN

Definition

Copy


            CREATE procedure dbo.USP_CONSTITUENTSOURCEANALYSIS_UPDATESMARTFIELD
            (
                @CACHETABLENAME nvarchar(128),
                @SMARTFIELDDISPLAYNAME nvarchar(100),
                @DATATYPE nvarchar(20),
                @CHANGEAGENTID uniqueidentifier = null,
                @CHANGEDATE datetime = null
            )
            as
            set nocount on;

            begin try
                if @DATATYPE <> 'int' and @DATATYPE <> 'nvarchar' and @DATATYPE <> 'datetime' and @DATATYPE <> 'money' and @DATATYPE <> 'bit'
                    raiserror('Invalid data type. Valid options: int, nvarchar, datetime, money, bit', 13, 1);

                if @CHANGEAGENTID is null
                    exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
                if @CHANGEDATE is null
                    set @CHANGEDATE = getdate();

                declare @SMARTFIELDINSTANCEID uniqueidentifier;
                declare @SMARTFIELDDATE datetime;
                declare @SMARTFIELDTABLENAME nvarchar(128);

                select top 1 @SMARTFIELDTABLENAME = TABLECATALOG.TABLENAME, @SMARTFIELDDATE = coalesce(SMARTFIELD.LASTRUNON, getdate()) from SMARTFIELD
                inner join dbo.SMARTFIELDCATALOG on SMARTFIELDCATALOG.ID = SMARTFIELDCATALOGID
                inner join dbo.TABLECATALOG on TABLECATALOG.ID = SMARTFIELD.TABLECATALOGID
                where SMARTFIELDCATALOG.DISPLAYNAME like @SMARTFIELDDISPLAYNAME
                order by SMARTFIELD.LASTRUNON desc

                if len(@SMARTFIELDTABLENAME) > 0
                begin
                    declare @SQL nvarchar(max);

                    set @SQL = 'update dbo.' + @CACHETABLENAME + ' set NEEDSUPDATE = 0, CHANGEDBYID = @CHANGEAGENTID, DATECHANGED = @CHANGEDATE where NEEDSUPDATE = 1';
                    exec sp_executesql @SQL, N'@CHANGEAGENTID uniqueidentifier, @CHANGEDATE datetime', @CHANGEAGENTID = @CHANGEAGENTID, @CHANGEDATE = @CHANGEDATE;

                    set @SQL = 
                        '
                        with [CTE] as 
                        ( 
                            select 
                                CONSTITUENT.ID as [CONSTITUENTID], 
                                coalesce([SMARTFIELDTABLE].VALUE, cast(0 as ' + @DATATYPE + ')) as [VALUE]
                            from dbo.CONSTITUENT
                            left join dbo.' + @SMARTFIELDTABLENAME + ' as [SMARTFIELDTABLE] on [SMARTFIELDTABLE].ID = CONSTITUENT.ID
                            inner join dbo.' + @CACHETABLENAME + ' as [CACHETABLE] on [CACHETABLE].CONSTITUENTID = CONSTITUENT.ID
                            where @SMARTFIELDDATE > [CACHETABLE].DATEFROM
                        )
                        update dbo.' + @CACHETABLENAME + ' 
                            set NEEDSUPDATE = 1,
                                DATETO = @SMARTFIELDDATE,
                                CHANGEDBYID = @CHANGEAGENTID,
                                DATECHANGED = @CHANGEDATE
                        from ' + @CACHETABLENAME +' as [CACHETABLE]
                        inner join [CTE] on [CTE].CONSTITUENTID = [CACHETABLE].CONSTITUENTID and [CACHETABLE].DATETO is null
                        where
                            [CTE].VALUE <> [CACHETABLE].VALUE
                        '

                    exec sp_executesql @SQL, N'@CHANGEAGENTID uniqueidentifier, @CHANGEDATE datetime, @SMARTFIELDDATE datetime', @CHANGEAGENTID = @CHANGEAGENTID, @CHANGEDATE = @CHANGEDATE, @SMARTFIELDDATE = @SMARTFIELDDATE;

                    set @SQL = 
                        '
                        with [CTE] as
                        (
                            select
                                CONSTITUENT.ID as [CONSTITUENTID],
                                coalesce([SMARTFIELDTABLE].VALUE, cast(0 as ' + @DATATYPE + ')) as [VALUE]
                            from dbo.CONSTITUENT
                            left join ' + @SMARTFIELDTABLENAME + ' as [SMARTFIELDTABLE] on [SMARTFIELDTABLE].ID = CONSTITUENT.ID
                            left join ' + @CACHETABLENAME + ' as [CACHETABLE] on [CACHETABLE].CONSTITUENTID = CONSTITUENT.ID
                            where [CACHETABLE].ID is null or [CACHETABLE].NEEDSUPDATE = 1
                        )
                        insert into dbo.' + @CACHETABLENAME + ' (ID, NEEDSUPDATE, CONSTITUENTID, DATEFROM, DATETO, VALUE, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED)
                            select
                                newid(),
                                0,
                                [CTE].CONSTITUENTID,
                                @SMARTFIELDDATE,
                                null,
                                [CTE].VALUE,
                                @CHANGEAGENTID,
                                @CHANGEAGENTID,
                                @CHANGEDATE,
                                @CHANGEDATE
                            from [CTE]
                        ';

                    exec sp_executesql @SQL, N'@CHANGEAGENTID uniqueidentifier, @CHANGEDATE datetime, @SMARTFIELDDATE datetime', @CHANGEAGENTID = @CHANGEAGENTID, @CHANGEDATE = @CHANGEDATE, @SMARTFIELDDATE = @SMARTFIELDDATE;        
                end

            end try
            begin catch
                exec dbo.USP_RAISE_ERROR;
                return 1;
            end catch

            return 0;