USP_ADHOCQUERYDEPENDENCY_GENERATEDEPENDENCIES

Parameters

Parameter Parameter Type Mode Description
@ADHOCQUERYID uniqueidentifier IN
@IDSETREGISTERID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN

Definition

Copy


CREATE  procedure USP_ADHOCQUERYDEPENDENCY_GENERATEDEPENDENCIES 
  (
  @ADHOCQUERYID uniqueidentifier, 
  @IDSETREGISTERID uniqueidentifier,
  @CHANGEAGENTID uniqueidentifier=null
  )
with execute as owner
as
  if @CHANGEAGENTID is null
    exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

  declare @CURRENTDATE datetime
    set @CURRENTDATE=GetDate();

  --clear the current values for this query in the dependencies table

  delete from dbo.ADHOCQUERYDEPENDENCY where dbo.ADHOCQUERYDEPENDENCY.ADHOCQUERYID=@ADHOCQUERYID;

  declare @TABLENAME as nvarchar(100);
  declare @DBTABLENAME as nvarchar(100);
  declare @FOREIGNKEYCOLUMNNAME as nvarchar(100);
  declare @TABLEDESCRIPTION as nvarchar(255);
  declare @RECORDTYPEID as uniqueidentifier;
  declare @DELETEREFERENTIALACTIONDESCRIPTION as nvarchar(255);
  declare @FOREIGNKEYNAME as nvarchar(255);

  declare @SQLTEXT as nvarchar(2000);

  --possible_tables cursor calculates all of the foreign key relationships in the db between the tables, this includes custom user ones

  declare POSSIBLETABLES_CURSOR cursor for 
    with xmlnamespaces ('bb_appfx_table' as x)  
      select 
        (select TABLECATALOG.TABLESPECXML.value('(/x:TableSpec/@Name)[1]', 'nvarchar(max)')) as TABLENAME,  --This table name is also the record type

        TABLECATALOG.DESCRIPTION  as TABLEDESCRIPTION,
        SYSTABLES.name as DBTABLENAME, 
        SYSTEMCOLUMNS.name as FOREIGNKEYCOLUMNNAME,
        RECORDTYPE.ID as RECORDTYPEID,
        FOREIGNKEYS.delete_referential_action_desc as DELETEREFERENTIALACTIONDESCRIPTION,
        FOREIGNKEYS.name as FOREIGNKEYNAME
      from sys.foreign_keys AS FOREIGNKEYS 
        inner join sys.foreign_key_columns as FOREIGNKEYCOLUMNS ON FOREIGNKEYS.OBJECT_ID = FOREIGNKEYCOLUMNS.constraint_object_id
        inner join sys.tables as SYSTABLES on FOREIGNKEYCOLUMNS.parent_object_id = SYSTABLES.object_id 
      inner join sys.columns as SYSTEMCOLUMNS on FOREIGNKEYCOLUMNS.parent_object_id = SYSTEMCOLUMNS.object_id and FOREIGNKEYCOLUMNS.parent_column_id = SYSTEMCOLUMNS.column_id
        inner join dbo.TABLECATALOG on TABLECATALOG.TABLENAME=SYSTABLES.name
        inner join dbo.RECORDTYPE on RECORDTYPE.BASETABLENAME=SYSTABLES.name
      where OBJECT_NAME (FOREIGNKEYCOLUMNS.referenced_object_id) in ('adhocquery', 'IDSETREGISTER'
        and SYSTABLES.name <> 'ADHOCQUERYDEPENDENCY'  -- excluding the entries for this dependency process and associated table

        and SYSTABLES.name <> 'ADHOCQUERYDEPENDENCYBUSINESSPROCESS';

  open POSSIBLETABLES_CURSOR;  
  fetch next from POSSIBLETABLES_CURSOR into 
    @TABLENAME
    @TABLEDESCRIPTION
    @DBTABLENAME
    @FOREIGNKEYCOLUMNNAME
    @RECORDTYPEID
    @DELETEREFERENTIALACTIONDESCRIPTION
    @FOREIGNKEYNAME

  while @@FETCH_STATUS = 0  
    begin  
      set @SQLTEXT='declare @ADHOCQUERYID uniqueidentifier; set @ADHOCQUERYID='''+ CAST(@ADHOCQUERYID AS VARCHAR(36)) + '''; ';
      set @SQLTEXT=@SQLTEXT+'declare @IDSETREGISTERID uniqueidentifier; set @IDSETREGISTERID='''+ CAST(@IDSETREGISTERID AS VARCHAR(36)) + '''; ';
      set @SQLTEXT=@SQLTEXT+'declare @CHANGEAGENTID uniqueidentifier; set @CHANGEAGENTID='''+ CAST(@CHANGEAGENTID AS VARCHAR(36)) + '''; ';
      set @SQLTEXT=@SQLTEXT+'declare @CURRENTDATE datetime; set @CURRENTDATE=GetDate(); ';

      -- to handle strings that contain a quotation mark correctly

      set @SQLTEXT=@SQLTEXT+'declare @TABLENAME nvarchar(200); set @TABLENAME='''+ replace(@TABLENAME, '''', '''''') +'''; ';
      set @SQLTEXT=@SQLTEXT+'declare @TABLEDESCRIPTION nvarchar(510); set @TABLEDESCRIPTION='''+ replace(@TABLEDESCRIPTION, '''', '''''') +'''; ';

     --insert a row for each dependency

      set @SQLTEXT= @SQLTEXT + 'insert into dbo.ADHOCQUERYDEPENDENCY ';
      set @SQLTEXT= @SQLTEXT + '(ADHOCQUERYID, IDSETREGISTERID, TABLENAME, TABLEDESCRIPTION, DBTABLENAME, RECORDTYPEID, RECORDID, DELETEREFERENTIALACTIONDESCRIPTION, FOREIGNKEYNAME, ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED) ';

      if @IDSETREGISTERID='00000000-0000-0000-0000-000000000000'
        begin
          set @SQLTEXT= @SQLTEXT + '(select @ADHOCQUERYID, null, @TABLENAME, @TABLEDESCRIPTION, '''+@DBTABLENAME+''', '''+  CAST(@RECORDTYPEID AS VARCHAR(36))+ ''', ' +@DBTABLENAME + '.ID, '''+  @DELETEREFERENTIALACTIONDESCRIPTION+ ''', '''+  @FOREIGNKEYNAME+ ''', @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE ';
          set @SQLTEXT= @SQLTEXT + 'from ' + @DBTABLENAME + ' where ' + @FOREIGNKEYCOLUMNNAME + ' =@ADHOCQUERYID);';
        end
      else 
      begin
         set @SQLTEXT= @SQLTEXT + '(select @ADHOCQUERYID, @IDSETREGISTERID, @TABLENAME, @TABLEDESCRIPTION, '''+@DBTABLENAME+''', '''+  CAST(@RECORDTYPEID AS VARCHAR(36))+ ''', ' +@DBTABLENAME + '.ID, '''+  @DELETEREFERENTIALACTIONDESCRIPTION+ ''', '''+  @FOREIGNKEYNAME+ ''', @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE ';
         set @SQLTEXT= @SQLTEXT + 'from ' + @DBTABLENAME + ' where ' + @FOREIGNKEYCOLUMNNAME + ' =@ADHOCQUERYID or ' + @FOREIGNKEYCOLUMNNAME + '=@IDSETREGISTERID) ;';
      end;

      exec ( @SQLTEXT);
    fetch next from POSSIBLETABLES_CURSOR into @TABLENAME, @TABLEDESCRIPTION, @DBTABLENAME, @FOREIGNKEYCOLUMNNAME, @RECORDTYPEID, @DELETEREFERENTIALACTIONDESCRIPTION, @FOREIGNKEYNAME
   end;  
  close POSSIBLETABLES_CURSOR;  
  deallocate POSSIBLETABLES_CURSOR;

  -- check other dependencies that don't have FK constraint to the current query selection

  if @IDSETREGISTERID <> '00000000-0000-0000-0000-000000000000'
     begin
        --this handles dependencies to smart query, which don't have a FK constraint


        --get the recordId for SmartQueryInstance

        declare @RECORDTYPEIDSMARTQUERYINSTANCE uniqueidentifier;
        set @RECORDTYPEIDSMARTQUERYINSTANCE=(select ID from dbo.RECORDTYPE where BASETABLENAME='SMARTQUERYINSTANCE');

        insert into dbo.ADHOCQUERYDEPENDENCY 
            (ADHOCQUERYID, 
            IDSETREGISTERID, 
            TABLENAME, 
            TABLEDESCRIPTION, 
            DBTABLENAME, 
            RECORDTYPEID, 
            RECORDID, 
            ADDEDBYID, 
            CHANGEDBYID, 
            DATEADDED, 
            DATECHANGED)
        select 
            @ADHOCQUERYID
            @IDSETREGISTERID
            SMARTQUERYINSTANCE.NAME, 
            'A dependent smart query'
            'SMARTQUERYINSTANCE'
            @RECORDTYPEIDSMARTQUERYINSTANCE
            SMARTQUERYINSTANCE.ID, 
            @CHANGEAGENTID
            @CHANGEAGENTID
            @CURRENTDATE
            @CURRENTDATE
        from dbo.SMARTQUERYINSTANCE
        where CAST(SMARTQUERYINSTANCE.DATAFORMITEMFILTERXML as nvarchar(max)) LIKE '%' + convert(nvarchar(36), @IDSETREGISTERID) + '%'

        --this handles dependencies to smartfields, which don't have a FK constraint


        --get the recordId for SmartField

        declare @RECORDTYPEIDSMARTFIELD uniqueidentifier;
        set @RECORDTYPEIDSMARTFIELD=(select ID from dbo.RECORDTYPE where BASETABLENAME='SMARTFIELD');

        insert into dbo.ADHOCQUERYDEPENDENCY 
            (ADHOCQUERYID, 
            IDSETREGISTERID, 
            TABLENAME, 
            TABLEDESCRIPTION, 
            DBTABLENAME, 
            RECORDTYPEID, 
            RECORDID, 
            ADDEDBYID, 
            CHANGEDBYID, 
            DATEADDED, 
            DATECHANGED)
        select 
            @ADHOCQUERYID
            @IDSETREGISTERID
            SMARTFIELD.NAME, 
            'A dependent smart field'
            'SMARTFIELD'
            @RECORDTYPEIDSMARTFIELD
            SMARTFIELD.ID, 
            @CHANGEAGENTID
            @CHANGEAGENTID
            @CURRENTDATE
            @CURRENTDATE
        from dbo.SMARTFIELD
        where CAST(SMARTFIELD.SMARTFIELDDATAFORMITEM as nvarchar(max)) LIKE '%' + convert(nvarchar(36), @IDSETREGISTERID) + '%';         

        -- This handles dependencies to tasks, which don't have a FK constraint


        -- Get the recordId for task

        declare @RECORDTYPEIDTASKCATALOG uniqueidentifier;
        set @RECORDTYPEIDTASKCATALOG=(select ID from dbo.RECORDTYPE where BASETABLENAME='TASKCATALOG');

        insert into dbo.ADHOCQUERYDEPENDENCY 
            (ADHOCQUERYID, 
            IDSETREGISTERID, 
            TABLENAME, 
            TABLEDESCRIPTION, 
            DBTABLENAME, 
            RECORDTYPEID, 
            RECORDID, 
            ADDEDBYID, 
            CHANGEDBYID, 
            DATEADDED, 
            DATECHANGED)
        select
            @ADHOCQUERYID
            @IDSETREGISTERID
            TASKCATALOG.NAME, 
            'A dependent task'
            'TASKCATALOG'
            @RECORDTYPEIDTASKCATALOG
            TASKCATALOG.ID, 
            @CHANGEAGENTID
            @CHANGEAGENTID
            @CURRENTDATE
            @CURRENTDATE
        from dbo.TASKCATALOG
        where CAST(TASKCATALOG.TASKSPECXML as nvarchar(max)) LIKE '%' + convert(nvarchar(36), @ADHOCQUERYID) + '%'
     end