USP_MKTSEGMENT_CREATEORUPDATEVIEW

Used to create or update a segment's view.

Parameters

Parameter Parameter Type Mode Description
@SEGMENTID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@USEINQUERYDESIGNER bit IN

Definition

Copy


CREATE procedure dbo.USP_MKTSEGMENT_CREATEORUPDATEVIEW
(
  @SEGMENTID uniqueidentifier,
  @CHANGEAGENTID uniqueidentifier,
  @USEINQUERYDESIGNER bit = 0
)
with execute as owner
as
  set nocount on;

  declare @CURRENTDATE datetime;

  declare @SEGSQL nvarchar(max);
  declare @VIEWSQL nvarchar(max);
  declare @SEGMENTVIEW nvarchar(60);
  declare @TABLECOUNT int;
  declare @BASETABLE nvarchar(255);
  declare @PREVTABLE nvarchar(255);
  declare @JOINTABLE nvarchar(255);
  declare @SELECTIONNAME nvarchar(300);

  declare @SEGMENTNAME nvarchar(100);
  declare @SEGMENTDESCRIPTION nvarchar(255);
  declare @DATATYPE nvarchar(128);
  declare @SELECTIONID uniqueidentifier;
  declare @IDSETREGISTERID uniqueidentifier;
  declare @RECORDTYPEID uniqueidentifier;
  declare @NEWIDSET bit;

  declare @LOCKRESULT int;
  declare @RETVAL int;

  begin try
    set @TABLECOUNT = 1;
    set @BASETABLE = null;
    set @CURRENTDATE = getdate();


    /**** Get the segment information ****/
    select
      @SEGMENTVIEW = dbo.[UFN_MKTSEGMENT_MAKEVIEWNAME]([MKTSEGMENT].[ID]),
      @SEGMENTNAME = [MKTSEGMENT].[NAME] + ' (Segment)',
      @SEGMENTDESCRIPTION = [MKTSEGMENT].[DESCRIPTION],
      @DATATYPE = [QUERYVIEWCATALOG].[PRIMARYKEYTYPENAME],
      @RECORDTYPEID = [QUERYVIEWCATALOG].[RECORDTYPEID]
    from dbo.[MKTSEGMENT]
    inner join dbo.[QUERYVIEWCATALOG] on [QUERYVIEWCATALOG].[ID] = [MKTSEGMENT].[QUERYVIEWCATALOGID]
    where [MKTSEGMENT].[ID] = @SEGMENTID;



    /**** Segment selections ****/
    declare SEGMENTCURSOR cursor local fast_forward for
      select [MKTSEGMENTSELECTION].[SELECTIONID]
      from dbo.[MKTSEGMENTSELECTION]
      inner join dbo.[IDSETREGISTER] on [MKTSEGMENTSELECTION].[SELECTIONID] = [IDSETREGISTER].[ID]
      where [MKTSEGMENTSELECTION].[SEGMENTID] = @SEGMENTID;

    open SEGMENTCURSOR;
    fetch next from SEGMENTCURSOR into @SELECTIONID;

    while (@@FETCH_STATUS = 0)
    begin
      --Remove the CR and LF characters since we are inserting this name into a dash-dash (--) comment in the SQL we are building...

      select @SELECTIONNAME = replace(replace([NAME], char(13), ''), char(10), '')
      from dbo.[IDSETREGISTER]
      where [ID] = @SELECTIONID;

      if @BASETABLE is null
        begin
          set @BASETABLE = '[T' + convert(nvarchar(10), @TABLECOUNT) + ']';
          set @SEGSQL = 'dbo.' + dbo.[UFN_MKTSELECTION_GETFUNCTIONNAME](@SELECTIONID) + ' as ' + @BASETABLE + '  --' + @SELECTIONNAME + char(13);

          set @PREVTABLE = @BASETABLE;
        end 
      else
        begin
          set @JOINTABLE = '[T' + convert(nvarchar(10), @TABLECOUNT) + ']';
          set @SEGSQL = isnull(@SEGSQL,'') + 'inner join dbo.' + dbo.[UFN_MKTSELECTION_GETFUNCTIONNAME](@SELECTIONID) + ' as ' + @JOINTABLE + ' on ' + @JOINTABLE + '.[ID] = ' + @BASETABLE + '.[ID]  --' + @SELECTIONNAME + char(13);

          set @PREVTABLE = @JOINTABLE;
        end

      set @TABLECOUNT = @TABLECOUNT + 1;
      fetch next from SEGMENTCURSOR into @SELECTIONID;
    end;

    close SEGMENTCURSOR;
    deallocate SEGMENTCURSOR;



    /**** Get an applock for the segment while we modify its view ****/
    exec @LOCKRESULT = dbo.[USP_MKTSEGMENT_GETAPPLOCK] @SEGMENTID, 0;
    if @LOCKRESULT < 0
      raiserror('A failure or timeout occurred while requesting an app lock to save a segment.', 13, 1);



    /**** Create or alter the segment view ****/
    declare @OBJID int;
    select @OBJID = object_id(@SEGMENTVIEW, N'V');
    if @OBJID is null
      set @VIEWSQL = 'create';
    else
      set @VIEWSQL = 'alter';

    set @VIEWSQL = @VIEWSQL + ' view dbo.[' + @SEGMENTVIEW + ']' + char(13) +
                   'as' + char(13) +
                   'select ' + (case when @BASETABLE is null
                                  then 'top(0) cast(null as ' + @DATATYPE + ') as [ID]'
                                  else @BASETABLE + '.[ID] from ' + @SEGSQL
                                end);

    exec (@VIEWSQL);

    /**** Grant rights for new views ****/
    if @OBJID is null
      exec ('grant select on dbo.[' + @SEGMENTVIEW + '] to BBAPPFXSERVICEROLE');



    /**** Add to the ID Set Register ****/
    -- change agent ID

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

    -- get the view row count

    declare @COUNTSQL nvarchar(max);
    declare @PARAMETERS nvarchar(max);
    declare @NUMROWS int;
    set @COUNTSQL = 'select @NUMROWS = count(*) from dbo.[' + @SEGMENTVIEW + ']';
    set @PARAMETERS = N'@NUMROWS int OUTPUT' 
    exec sp_executeSQL @COUNTSQL, @PARAMETERS, @NUMROWS OUTPUT;

    --Get the ID set ID if this is an edit operation, else it will be null.  Also get the segment record type.

    select distinct
      @IDSETREGISTERID = [MKTSEGMENT].[IDSETREGISTERID],
      @RECORDTYPEID = isnull([IDSETREGISTER].[RECORDTYPEID], @RECORDTYPEID),
      @NEWIDSET = (case when [MKTSEGMENT].[IDSETREGISTERID] is null then 1 else 0 end),
      @USEINQUERYDESIGNER = (case when [MKTSEGMENT].[IDSETREGISTERID] is null then @USEINQUERYDESIGNER else (select [USEINQUERYDESIGNER] from dbo.[IDSETREGISTER] where [ID] = [MKTSEGMENT].[IDSETREGISTERID]) end)
    from dbo.[MKTSEGMENT]
    left join dbo.[MKTSEGMENTSELECTION] on [MKTSEGMENTSELECTION].[SEGMENTID] = [MKTSEGMENT].[ID]
    left join dbo.[IDSETREGISTER] on [MKTSEGMENTSELECTION].[SELECTIONID] = [IDSETREGISTER].[ID]
    where [MKTSEGMENT].[ID] = @SEGMENTID;

    --Create the ID set...

    exec [dbo].[USP_IDSETREGISTER_CREATEORUPDATE] 
       @IDSETREGISTERID output
      ,@SEGMENTNAME 
      ,@SEGMENTDESCRIPTION
      ,@SEGMENTVIEW
      ,0
      ,@RECORDTYPEID
      ,@USEINQUERYDESIGNER
      ,1
      ,@NUMROWS
      ,@CHANGEAGENTID;

    --Mark as inactive to hide from searches

    --Make sure the RECORDTYPEID gets set.  The SP doesn't update it on an UPDATE.

    update dbo.[IDSETREGISTER] set
      [RECORDTYPEID] = @RECORDTYPEID,
      [ACTIVE] = (case when @NEWIDSET = 1 then 0 else [ACTIVE] end),
      [CHANGEDBYID] = @CHANGEAGENTID,
      [DATECHANGED] = @CURRENTDATE
    where [ID] = @IDSETREGISTERID;

    --Save the ID set ID on the segment table...

    update dbo.[MKTSEGMENT] set
      [IDSETREGISTERID] = @IDSETREGISTERID,
      [CHANGEDBYID] = @CHANGEAGENTID,
      [DATECHANGED] = @CURRENTDATE 
    where [ID] = @SEGMENTID;
  end try

  begin catch
    exec dbo.USP_RAISE_ERROR;
    set @RETVAL = 1;
  end catch


  if @LOCKRESULT is not null
    --Release the applock now that we are done with the segment

    exec dbo.[USP_MKTSEGMENT_RELEASEAPPLOCK] @SEGMENTID, 0;

  return isnull(@RETVAL, 0);