USP_MKTSEGMENT_FINDDUPLICATES

This provides the ability to search for duplicates of a segment.

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@SEGMENTTYPECODE tinyint IN
@CODE nvarchar(10) IN
@SELECTIONS xml IN
@LISTID uniqueidentifier IN
@MAXROWS smallint IN

Definition

Copy


CREATE procedure dbo.[USP_MKTSEGMENT_FINDDUPLICATES]
(
  @ID uniqueidentifier = null,
  @SEGMENTTYPECODE tinyint,
  @CODE nvarchar(10) = null,
  @SELECTIONS xml = null,
  @LISTID uniqueidentifier = null,
  @MAXROWS smallint = 100
)
as
  set nocount on;

  declare @SEGMENTSWITHDUPLICATESELECTIONS table ([ID] uniqueidentifier primary key);
  declare @SEGMENTSWITHDUPLICATECODES table ([ID] uniqueidentifier primary key);


  --If selections are specified, then gather all segments that have duplicate selections...

  if isnull(cast(@SELECTIONS as nvarchar(max)), '') <> ''
    begin
      declare @COUNT integer;

      select
        @COUNT = count(*)
      from dbo.[UFN_MKTSEGMENT_GETSELECTIONS_FROMITEMLISTXML](@SELECTIONS);

      insert into @SEGMENTSWITHDUPLICATESELECTIONS ([ID])
        select distinct [MKTSEGMENTSELECTION].[SEGMENTID]
        from dbo.[MKTSEGMENTSELECTION]
        inner join dbo.[UFN_MKTSEGMENT_GETSELECTIONS_FROMITEMLISTXML](@SELECTIONS) as [SELECTIONS] on [SELECTIONS].[SELECTIONID] = [MKTSEGMENTSELECTION].[SELECTIONID]
        inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTSELECTION].[SEGMENTID]
        where (@ID is null or [MKTSEGMENTSELECTION].[SEGMENTID] <> @ID)
        and (select count(*) from dbo.[MKTSEGMENTSELECTION] as [SS] where [SS].[SEGMENTID] = [MKTSEGMENTSELECTION].[SEGMENTID]) = @COUNT
        and [MKTSEGMENT].[ISSYSTEM] = 0
        group by [MKTSEGMENTSELECTION].[SEGMENTID]
        having count([MKTSEGMENTSELECTION].[SEGMENTID]) = @COUNT;
    end


  --If a code is specified, then gather all segments that have a duplicate code...

  if isnull(@CODE, '') <> '' and @SEGMENTTYPECODE is not null
    begin
      if @SEGMENTTYPECODE = 1  --Constituent

        insert into @SEGMENTSWITHDUPLICATECODES ([ID])
          select [ID]
          from dbo.[MKTSEGMENT]
          where (@ID is null or [ID] <> @ID)
          and [SEGMENTTYPECODE] in (1, 2)
          and [ISSYSTEM] = 0
          and [CODE] = @CODE;

      else if @SEGMENTTYPECODE = 2  --List

        begin
          --A list segment's code is required and must be not be in use by a constituent segment 

          --and must be unique amongst all segments with the same parent list.

          if @LISTID is not null
            insert into @SEGMENTSWITHDUPLICATECODES ([ID])
              --Check against all constituent segments...

              select [ID]
              from dbo.[MKTSEGMENT]
              where (@ID is null or [ID] <> @ID)
              and [SEGMENTTYPECODE] = 1
              and [ISSYSTEM] = 0
              and [CODE] = @CODE

              union all

              --Check against all list segments from the same parent list...

              select [MKTSEGMENT].[ID]
              from dbo.[MKTSEGMENT]
              inner join dbo.[MKTSEGMENTLIST] on [MKTSEGMENTLIST].[ID] = [MKTSEGMENT].[CURRENTSEGMENTLISTID]
              where (@ID is null or [MKTSEGMENT].[ID] <> @ID)
              and [SEGMENTTYPECODE] = 2
              and [MKTSEGMENT].[ISSYSTEM] = 0
              and [MKTSEGMENTLIST].[LISTID] = @LISTID
              and [MKTSEGMENT].[CODE] = @CODE;
        end

      else if @SEGMENTTYPECODE in (6, 7, 8)  --Public media

        insert into @SEGMENTSWITHDUPLICATECODES ([ID])
          select [ID]
          from dbo.[MKTSEGMENT]
          where (@ID is null or [ID] <> @ID)
          and [SEGMENTTYPECODE] in (6, 7, 8)
          and [ISSYSTEM] = 0
          and [CODE] = @CODE;

      else  --All other segment types

        insert into @SEGMENTSWITHDUPLICATECODES ([ID])
          select [ID]
          from dbo.[MKTSEGMENT]
          where (@ID is null or [ID] <> @ID)
          and [SEGMENTTYPECODE] = @SEGMENTTYPECODE
          and [ISSYSTEM] = 0
          and [CODE] = @CODE;
    end;


  --Find all segments that meet any of the duplicate criteria (ie: selections, code)

  with [DUPSEGMENTS] ([SEGMENTID], [DUPLICATESELECTION], [DUPLICATECODE]) as
  (
    select [ID], 1, 0 from @SEGMENTSWITHDUPLICATESELECTIONS
    union all
    select [ID], 0, 1 from @SEGMENTSWITHDUPLICATECODES  
  ),
  [DUPLICATES] ([SEGMENTID], [DUPLICATESELECTION], [DUPLICATECODE]) as
  (
    --Flatten/merge the results from the DUPSEGMENTS 'with' block...

    select
      [SEGMENTID],
      cast(max([DUPLICATESELECTION]) as bit) as [DUPLICATESELECTION],
      cast(max([DUPLICATECODE]) as bit) as [DUPLICATECODE]
    from [DUPSEGMENTS]
    group by [SEGMENTID]
  )
  select top (@MAXROWS)
    [MKTSEGMENT].[ID], 
    [MKTSEGMENT].[NAME], 
    [MKTSEGMENT].[DESCRIPTION], 
    [MKTSEGMENT].[CODE],
    dbo.[UFN_MKTSEGMENT_ISINUSE]([MKTSEGMENT].[ID]) as [INUSE],
    [DUPLICATES].[DUPLICATESELECTION],
    [DUPLICATES].[DUPLICATECODE]
  from dbo.[MKTSEGMENT]
  inner join [DUPLICATES] on [DUPLICATES].[SEGMENTID] = [MKTSEGMENT].[ID]
  where not exists(
    --Exclude appeal mailing segments

    select 1
    from dbo.[MKTSEGMENTATIONSEGMENT]
    inner join dbo.[APPEALMAILING] on [APPEALMAILING].[MKTSEGMENTATIONSEGMENTID] = [MKTSEGMENTATIONSEGMENT].[ID]
    where [MKTSEGMENTATIONSEGMENT].[SEGMENTID] = [MKTSEGMENT].[ID]
  )
  and [MKTSEGMENT].[ISSYSTEM] = 0
  order by [MKTSEGMENT].[NAME];

  return 0;