USP_CONSTITUENCIES_VALIDATECONSTITUENCIES

USP_CONSTITUENCIES_VALIDATECONSTITUENCIES

Parameters

Parameter Parameter Type Mode Description
@CONSTITUENCIES xml IN

Definition

Copy


            CREATE procedure dbo.USP_CONSTITUENCIES_VALIDATECONSTITUENCIES(
                @CONSTITUENCIES xml
            ) as
                set nocount on;

                declare @CONSTITUENCIESTABLE table
                (
                    ID uniqueidentifier,
                    CONSTITUENCYCODEID uniqueidentifier,
                    DATEFROM datetime,
                    DATETO datetime
                );

                insert into @CONSTITUENCIESTABLE(ID, CONSTITUENCYCODEID, DATEFROM, DATETO)
                    select ID, CONSTITUENCYCODEID, DATEFROM, DATETO
                    from dbo.UFN_CONSTITUENT_GETCONSTITUENCIES_FROMITEMLISTXML(@CONSTITUENCIES);

                -- Validate that constituencies are unique


                declare CONSTITUENCIESCURSOR cursor local fast_forward for
                    select
                        ID,
                        CONSTITUENCYCODEID,
                        DATEFROM,
                        DATETO
                    from
                        @CONSTITUENCIESTABLE;

                declare @ID uniqueidentifier;
                declare @CONSTITUENCYCODEID uniqueidentifier;
                declare @DATEFROM datetime;
                declare @DATETO datetime;
                declare @DUPLICATECOUNT int;

                open CONSTITUENCIESCURSOR;
                    fetch next from CONSTITUENCIESCURSOR into @ID, @CONSTITUENCYCODEID, @DATEFROM, @DATETO;
                    while @@FETCH_STATUS = 0 begin
                        select
                            @DUPLICATECOUNT = count(ID)
                        from
                            @CONSTITUENCIESTABLE
                        where
                            ID <> @ID and
                            CONSTITUENCYCODEID = @CONSTITUENCYCODEID and
                            (
                                ( DATETO   between @DATEFROM and @DATETO) or
                                (@DATETO   between  DATEFROM and  DATETO) or
                                ( DATEFROM between @DATEFROM and @DATETO) or
                                (@DATEFROM between  DATEFROM and  DATETO) or

                                ( DATEFROM is null and @DATEFROM <=  DATETO)   or
                                (@DATEFROM is null and  DATEFROM <= @DATETO)   or
                                ( DATETO   is null and @DATETO   >=  DATEFROM) or
                                (@DATETO   is null and  DATETO   >= @DATEFROM) or

                                (@DATEFROM is null and  DATEFROM is null) or
                                (@DATETO   is null and  DATETO   is null) or
                                (@DATEFROM is null and @DATETO   is null) or
                                ( DATEFROM is null and  DATETO   is null)
                            );

                        if @DUPLICATECOUNT >= 1 begin
                            raiserror('A constituency with the same Constituency type must not have overlapping dates.', 13, 1)
                            return 1;
                        end

                        fetch next from CONSTITUENCIESCURSOR into @ID, @CONSTITUENCYCODEID, @DATEFROM, @DATETO;
                    end

                --When a cursor is used, it should be explicitly closed/deallocated in case of blocking or USP running long

                close CONSTITUENCIESCURSOR;
                deallocate CONSTITUENCIESCURSOR;

                return 0;