USP_IDSETREGISTERDYNAMICIDSET_CREATEORUPDATE

Creates a static selection for a given idset.

Parameters

Parameter Parameter Type Mode Description
@IDSETREGISTERID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@STATICSELECTIONID uniqueidentifier INOUT
@STATICSELECTIONNAME nvarchar(300) IN
@STATICSELECTIONDESCRIPTION nvarchar(1024) IN

Definition

Copy


        create procedure dbo.USP_IDSETREGISTERDYNAMICIDSET_CREATEORUPDATE
        (
            @IDSETREGISTERID uniqueidentifier,
            @CHANGEAGENTID uniqueidentifier,
            @STATICSELECTIONID uniqueidentifier output,
            @STATICSELECTIONNAME nvarchar(300) = null,
            @STATICSELECTIONDESCRIPTION nvarchar(1024) = null
        )
        -- Must execute this SP as owner since we're creating new tables.

        with execute as owner
        as 
            begin
                set nocount on;

                declare @DYNAMICDBOBJNAME nvarchar(128);

                select
                    @DYNAMICDBOBJNAME = IDSETREGISTER.[DBOBJECTNAME]
                from
                    dbo.IDSETREGISTER
                where
                    IDSETREGISTER.[ID] = @IDSETREGISTERID;

                declare @IDSETTABLENAME nvarchar(128) = N'IDSETREGISTERDYNAMICIDSET' + replace(@IDSETREGISTERID, '-', N'') + N'_STATICIDSET';

                -- If the table already exists, just delete everything in it.

                if object_id(N'dbo.' + @IDSETTABLENAME) is not null
                begin
                    declare @TRUNCATETABLESQL nvarchar(max) = N'truncate table [dbo].[' + @IDSETTABLENAME + N']';
                    exec dbo.sp_executesql @TRUNCATETABLESQL;
                end
                else
                begin
                    declare @CREATETABLESQL nvarchar(max) = N'create table [dbo].[' + @IDSETTABLENAME + N']([ID] uniqueidentifier)';
                    exec dbo.sp_executesql @CREATETABLESQL ;
                end

                -- Insert data into the static selection table:

                declare @INSERTSQL nvarchar(max) = N'insert into [dbo].[' + @IDSETTABLENAME + N']([ID])' + char(13) +
                        N'select [ID] from dbo.' + @DYNAMICDBOBJNAME + N'()';

                exec sp_executesql @INSERTSQL;

                -- Now that the physical table is created, create a function that wraps that table.

                declare @FUNCTIONNAME nvarchar(128) = N'UFN_' + @IDSETTABLENAME;
                declare @FUNCTIONEXISTS bit = 0;
                declare @CREATEFUNCTIONSQL nvarchar(max) = 'create function';
                if object_id(N'dbo.' + @FUNCTIONNAME) is not null
                    set @CREATEFUNCTIONSQL = 'alter function'

                set @CREATEFUNCTIONSQL = @CREATEFUNCTIONSQL + N' dbo.' + @FUNCTIONNAME + N'()';
                set @CREATEFUNCTIONSQL = @CREATEFUNCTIONSQL + char(13) + N'returns table as return' + char(13);
                set @CREATEFUNCTIONSQL = @CREATEFUNCTIONSQL + N'select ID from dbo.' + @IDSETTABLENAME;

                exec dbo.sp_executesql @CREATEFUNCTIONSQL;

                -- Insert into IDSETREGISTER:

                    select
                        @STATICSELECTIONID = IDSETREGISTER.[ID]
                    from
                        dbo.IDSETREGISTER
                    where IDSETREGISTER.[DBOBJECTNAME] = @FUNCTIONNAME;

                declare @NUMROWS int;
                declare @RECORDTYPEID uniqueidentifier;
                declare @IDSETNAME nvarchar(300);
                declare @IDSETDESCRIPTION nvarchar(1024);
                select 
                    @NUMROWS = IDSETREGISTER.[NUMROWS],
                    @RECORDTYPEID = IDSETREGISTER.[RECORDTYPEID],
                    @IDSETNAME = IDSETREGISTER.[NAME] + N' (Static selection)',
                    @IDSETDESCRIPTION = N'Selection for ' + IDSETREGISTER.[NAME]
                from IDSETREGISTER where IDSETREGISTER.[ID] = @IDSETREGISTERID;
                if @STATICSELECTIONNAME is null
                    set @STATICSELECTIONNAME = @IDSETNAME;

                if @STATICSELECTIONDESCRIPTION is null
                    set @STATICSELECTIONDESCRIPTION = @IDSETDESCRIPTION;

                exec dbo.USP_IDSETREGISTER_CREATEORUPDATE
                    @STATICSELECTIONID output,
                    @STATICSELECTIONNAME,
                    @STATICSELECTIONDESCRIPTION,
                    @FUNCTIONNAME,
                    0,
                    @RECORDTYPEID,
                    0,
                    1,
                    @NUMROWS,
                    @CHANGEAGENTID;                

                -- Add an entry to the join table linking the static and dynamic selection:

                declare @IDSETREGISTERDYNAMICIDSETID uniqueidentifier = null;
                select
                    @IDSETREGISTERDYNAMICIDSETID = IDSETREGISTERDYNAMICIDSET.[ID]
                from
                    dbo.IDSETREGISTERDYNAMICIDSET
                where
                    IDSETREGISTERDYNAMICIDSET.[DYNAMICIDSETREGISTERID] = @IDSETREGISTERID and
                    IDSETREGISTERDYNAMICIDSET.[STATICIDSETREGISTERID] = @STATICSELECTIONID;

                if @IDSETREGISTERDYNAMICIDSETID is null
                begin
                    declare @CURRENTDATE datetime = getdate();
                    insert into dbo.IDSETREGISTERDYNAMICIDSET
                    (
                        [DYNAMICIDSETREGISTERID], 
                        [STATICIDSETREGISTERID],
                        [ADDEDBYID],
                        [CHANGEDBYID],
                        [DATEADDED],
                        [DATECHANGED]
                    )
                    values(
                        @IDSETREGISTERID
                        @STATICSELECTIONID,
                        @CHANGEAGENTID,
                        @CHANGEAGENTID,
                        @CURRENTDATE,
                        @CURRENTDATE
                    );
                end
            return 0;
            end