USP_DATALIST_MKTFINDERNUMBERLOOKUP

A datalist containing biographical and marketing effort information for a finder number.

Parameters

Parameter Parameter Type Mode Description
@FINDERNUMBER bigint IN Finder number
@RECORDSOURCEID uniqueidentifier IN Record source ID

Definition

Copy


CREATE procedure dbo.[USP_DATALIST_MKTFINDERNUMBERLOOKUP]
(
  @FINDERNUMBER bigint,
  @RECORDSOURCEID uniqueidentifier
)
as
  set nocount on;

  -- This table represents the structure returned by this SP - it is not used in this SP.  

  -- It is used in the following places:

  --    * Constituent.Catalog\USP_ACQUISITIONLIST_ADDMEMBER.xml.

  --    * Constituent.Catalog\USP_FINDERNUMBER_ADDMEMBER.xml

  --    * Blackbaud.AppFx.BBNCSvc\Catalog\Batch\USP_BBNC_BATCH_FINDERNUMBERLOOKUP.xml

  --    * Marketing.Integration\BatchIntegration.vb plug-in code.

  -- IF YOU ADD TO OR CHANGE THIS STRUCTURE YOU MUST UPDATE CODE IN THOSE PLACES AS WELL

  --

  --declare table (

  --  [ID] nvarchar(36),

  --  [CONSTITUENTID] nvarchar(36),

  --  [FULLNAME] nvarchar(255),

  --  [FIRSTNAME] nvarchar(255),

  --  [MIDDLENAME] nvarchar(255),

  --  [LASTNAME] nvarchar(255),

  --  [TITLE] nvarchar(255),

  --  [SUFFIX] nvarchar(255),

  --  [COUNTRY] nvarchar(255),

  --  [ADDRESSLINE1] nvarchar(255),

  --  [ADDRESSLINE2] nvarchar(255),

  --  [ADDRESSLINE3] nvarchar(255),

  --  [ADDRESSLINE4] nvarchar(255),

  --  [ADDRESSLINE5] nvarchar(255),

  --  [CITY] nvarchar(255),

  --  [STATE] nvarchar(255),

  --  [POSTCODE] nvarchar(255),

  --  [CART] nvarchar(255),

  --  [DPC] nvarchar(255),

  --  [LOT] nvarchar(255),

  --  [PHONENUMBER] nvarchar(255),

  --  [EMAILADDRESS] nvarchar(255),

  --  [MAILINGIDINTEGER] int,

  --  [MAILDATE] datetime,

  --  [SOURCECODE] nvarchar(50),

  --  [APPEALSYSTEMID] nvarchar(36),

  --  [APPEALID] nvarchar(100),

  --  [APPEALDESCRIPTION] nvarchar(100),

  --  [PACKAGECODE] nvarchar(10),

  --  [PACKAGENAME] nvarchar(100),

  --  [PACKAGEDESCRIPTION] nvarchar(255),

  --  [SEGMENTID] uniqueidentifier,

  --  [SEGMENTNAME] nvarchar(203),

  --  [LISTNAME] nvarchar(100),

  --  [TITLE2] nvarchar(255),

  --  [SUFFIX2] nvarchar(255)

  --);



  /* FINDER NUMBER LOOKUP */
  -- the range of finder numbers need to be added to MKTSEGMENATION table when

  --   the finder file is imported

  /* FINDER NUMBER LOOKUP */

  -- Find the mailing for this finder number

  declare @MAILINGID uniqueidentifier = dbo.[UFN_MKTSEGMENTATIONFINDERNUMBER_GETSEGMENTATION](@FINDERNUMBER);
  declare @MAILINGIDINTEGER int;
  declare @MAILDATE datetime;
  declare @APPEALSYSTEMID nvarchar(36);
  declare @APPEALID nvarchar(100);
  declare @APPEALDESCRIPTION nvarchar(255);
  declare @ISBBEC bit = dbo.[UFN_MKTRECORDSOURCE_VALIDFORBBEC](@RECORDSOURCEID);

  select
    @MAILINGIDINTEGER = [MKTSEGMENTATION].[IDINTEGER],
    @MAILDATE = isnull([MKTSEGMENTATION].[MAILDATE], [MKTSEGMENTATION].[ACTIVATEDATE]),
    @APPEALSYSTEMID = [MKTSEGMENTATIONACTIVATE].[APPEALSYSTEMID],
    @APPEALID = (case when @ISBBEC = 1 and [MKTSEGMENTATIONACTIVATE].[APPEALSYSTEMID] <> '' then (select [NAME] from dbo.[APPEAL] where [ID] = cast([MKTSEGMENTATIONACTIVATE].[APPEALSYSTEMID] as uniqueidentifier)) else [MKTSEGMENTATIONACTIVATE].[APPEALID] end),
    @APPEALDESCRIPTION = (case when @ISBBEC = 1 and [MKTSEGMENTATIONACTIVATE].[APPEALSYSTEMID] <> '' then (select [DESCRIPTION] from dbo.[APPEAL] where [ID] = cast([MKTSEGMENTATIONACTIVATE].[APPEALSYSTEMID] as uniqueidentifier)) else [MKTSEGMENTATIONACTIVATE].[APPEALDESCRIPTION] end)
  from dbo.[MKTSEGMENTATION]
  inner join dbo.[MKTSEGMENTATIONACTIVATE] on [MKTSEGMENTATIONACTIVATE].[SEGMENTATIONID] = [MKTSEGMENTATION].[ID] and [MKTSEGMENTATIONACTIVATE].[RECORDSOURCEID] = @RECORDSOURCEID
  where [MKTSEGMENTATION].[ID] = @MAILINGID
  and [MKTSEGMENTATION].[ACTIVE] = 1;

  --Either the mailing was not found or it has not been activated yet, so don't return any results...

  if @MAILINGIDINTEGER is null
    return 0;


  declare @SQL nvarchar(max);
  declare @PARAMS nvarchar(max);
  declare @DONORQUERYVIEWCATALOGID uniqueidentifier;
  declare @RECORDSOURCEID_INTERNAL uniqueidentifier;
  declare @PRIMARYKEYFIELD nvarchar(128);
  declare @DONORID nvarchar(36);
  declare @CONSTITUENTID nvarchar(36);
  declare @SEGMENTID uniqueidentifier;
  declare @TESTSEGMENTID uniqueidentifier;
  declare @SEGMENTNAME nvarchar(203);
  declare @SOURCECODE nvarchar(50);

  /* FINDER NUMBER LOOKUP */
  -- This will return the name of the Finder File table used for this mailing.  If no 

  --  finder file has been imported, then this comes back as null.  We'll check the finder file first for

  --  the record; if that fails then we can look in the @ACTIVATEDMAILINGTABLE

  --

  -- When we import a Finder File, we're also going to have update the MKTSOURCECODEMAP table.   That will 

  --  contain the mailing ID, source code, segmentation segment id, and segmentation test segment id.

  --  We'll join the MKTSOURCECODEMAP table to the MKTFINDERFILE_<guid> table on SOURCE CODE so we can 

  --  get at the SEGMENT information.

  --

  -- We also need to add the range of Finder Numbers to the Segmentation table so we can locate the mailing and

  --  grab the MKTSEGMENTATION.ID

  --

  declare @USEFINDERFILE bit;
  declare @FINDERFILETABLE nvarchar(128) = dbo.[UFN_MKTFINDERFILE_BUILDTABLENAME](@MAILINGID);
  declare @FINDERFILEHASCONSTITUENTID bit = 0;

  if exists(select 1 from [INFORMATION_SCHEMA].[TABLES] where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @FINDERFILETABLE)
    begin
      select
        @PRIMARYKEYFIELD = [PRIMARYKEYFIELD]
      from dbo.[QUERYVIEWCATALOG]
      where [ID] = @RECORDSOURCEID;

      --If they import multiple finder files and import the same FINDERNUMBER multiple times with different names, segments, or sourcecodes,

      --then we need to make sure we only grab info for the findernumber from the latest import file.

      set @SQL = 'with [RANKEDIMPORT] ([ID], [RANK]) as' + char(13) +
                 '(' + char(13) +
                 '  select' + char(13) +
                 '    [FT].[ID],' + char(13) +
                 '    row_number() over (partition by [FT].[FINDERNUMBER] order by [MKTFINDERFILEIMPORTPROCESS].[DATEADDED] desc) as [RANK]' + char(13) +
                 '  from dbo.[' + @FINDERFILETABLE + '] as [FT] with (index([IX_' + @FINDERFILETABLE + '_FINDERNUMBER]))' + char(13) +
                 '  inner join dbo.[MKTFINDERFILEIMPORTPROCESS] on [MKTFINDERFILEIMPORTPROCESS].[ID] = [FT].[FINDERFILEID]' + char(13) +
                 '  where [FT].[FINDERNUMBER] = @FINDERNUMBER' + char(13) +
                 ')' + char(13) +
                 'select' + char(13) +
                 '  @DONORQUERYVIEWCATALOGID = [SC].[DONORQUERYVIEWCATALOGID],' + char(13) +
                 '  @DONORID = cast([FT].[ID] as nvarchar(36)),' + char(13);

      --If the finder file table contains a field mapped to the record source primary key, then pull

      --that field too because that will indicate a constituent instead of a list person...

      if exists(select * from INFORMATION_SCHEMA.COLUMNS where [TABLE_SCHEMA] = 'dbo' and [TABLE_NAME] = @FINDERFILETABLE and [COLUMN_NAME] = @PRIMARYKEYFIELD)
        set @SQL += '  @CONSTITUENTID = cast([FT].[' + @PRIMARYKEYFIELD + '] as nvarchar(36)),' + char(13);
      else
        set @SQL += '  @CONSTITUENTID = null,' + char(13);

      set @SQL += '  @SEGMENTID = [SC].[SEGMENTATIONSEGMENTID],' + char(13) +
                  '  @TESTSEGMENTID = [SC].[SEGMENTATIONTESTSEGMENTID],' + char(13) +
                  '  @SOURCECODE = [FT].[SOURCECODE]' + char(13) +
                  'from [RANKEDIMPORT]' + char(13) +
                  'inner join dbo.[' + @FINDERFILETABLE + '] as [FT] on [FT].[ID] = [RANKEDIMPORT].[ID]' + char(13) +
                  'inner join dbo.[MKTSOURCECODEMAP] as [SC] on [FT].[SOURCECODE] = [SC].[SOURCECODE] and [SC].[SEGMENTATIONID] = @MAILINGID' + char(13) +
                  'where [RANKEDIMPORT].[RANK] = 1';

      set @PARAMS = '@MAILINGID uniqueidentifier, @FINDERNUMBER bigint, @DONORQUERYVIEWCATALOGID uniqueidentifier output, @DONORID nvarchar(36) output, @CONSTITUENTID nvarchar(36) output, @SEGMENTID uniqueidentifier output, @TESTSEGMENTID uniqueidentifier output, @SOURCECODE nvarchar(50) output';

      exec sp_executesql @SQL, @PARAMS, @MAILINGID = @MAILINGID, @FINDERNUMBER = @FINDERNUMBER, @DONORQUERYVIEWCATALOGID = @DONORQUERYVIEWCATALOGID output, @DONORID = @DONORID output, @CONSTITUENTID = @CONSTITUENTID output, @SEGMENTID = @SEGMENTID output, @TESTSEGMENTID = @TESTSEGMENTID output, @SOURCECODE = @SOURCECODE output;

      set @USEFINDERFILE = 1;
      set @RECORDSOURCEID_INTERNAL = @DONORQUERYVIEWCATALOGID;
      set @FINDERFILEHASCONSTITUENTID = (case when ltrim(rtrim(isnull(@CONSTITUENTID, ''))) = '' then 0 else 1 end);
    end
  else
    set @USEFINDERFILE = 0;
  /* FINDER NUMBER LOOKUP */

  -- if we didn't find the donor based on what's in the finder file, then try the activation table

  if @DONORID is null 
    begin
      -- Find the activated mailing table for the mailing

      declare @ACTIVATEDMAILINGTABLE nvarchar(128);
      set @ACTIVATEDMAILINGTABLE = dbo.[UFN_MKTSEGMENTATIONACTIVATE_MAKETABLENAME](@MAILINGID);

      set @SQL = 'select' + char(13) +
                 '  @DONORQUERYVIEWCATALOGID = [DONORQUERYVIEWCATALOGID],' + char(13) +
                 '  @DONORID = cast([DONORID] as nvarchar(36)),' + char(13) +
                 '  @SEGMENTID = [SEGMENTID],' + char(13) +
                 '  @TESTSEGMENTID = [TESTSEGMENTID],' + char(13) +
                 '  @SOURCECODE = [SOURCECODE]' + char(13) +
                 'from dbo.[' + @ACTIVATEDMAILINGTABLE + ']' + char(13) +
                 'where [FINDERNUMBER] = @FINDERNUMBER';

      set @PARAMS = '@FINDERNUMBER bigint, @DONORQUERYVIEWCATALOGID uniqueidentifier output, @DONORID nvarchar(36) output, @SEGMENTID uniqueidentifier output, @TESTSEGMENTID uniqueidentifier output, @SOURCECODE nvarchar(50) output';

      exec sp_executesql @SQL, @PARAMS, @FINDERNUMBER = @FINDERNUMBER, @DONORQUERYVIEWCATALOGID = @DONORQUERYVIEWCATALOGID output, @DONORID = @DONORID output, @SEGMENTID = @SEGMENTID output, @TESTSEGMENTID = @TESTSEGMENTID output, @SOURCECODE = @SOURCECODE output;

      set @USEFINDERFILE = 0;
    end;


  -- Grab the package information for the segment

  declare @PACKAGECODE nvarchar(10);
  declare @PACKAGENAME nvarchar(100);
  declare @PACKAGEDESCRIPTION nvarchar(255);

  if @TESTSEGMENTID is not null
    select
      @PACKAGECODE = [MKTSEGMENTATIONPACKAGE].[CODE],
      @PACKAGENAME = [MKTPACKAGE].[NAME],
      @PACKAGEDESCRIPTION = [MKTPACKAGE].[DESCRIPTION],
      @SEGMENTNAME = dbo.[UFN_MKTSEGMENTATIONTESTSEGMENT_GETNAME]([MKTSEGMENTATIONTESTSEGMENT].[ID])
    from dbo.[MKTSEGMENTATIONTESTSEGMENT]
    inner join dbo.[MKTPACKAGE] on [MKTPACKAGE].[ID] = [MKTSEGMENTATIONTESTSEGMENT].[PACKAGEID]
    inner join dbo.[MKTSEGMENTATIONPACKAGE] on [MKTSEGMENTATIONPACKAGE].[PACKAGEID] = [MKTPACKAGE].[ID] and [MKTSEGMENTATIONPACKAGE].[SEGMENTATIONID] = @MAILINGID
    where [MKTSEGMENTATIONTESTSEGMENT].[ID] = @TESTSEGMENTID;
  else
    select
      @PACKAGECODE = [MKTSEGMENTATIONPACKAGE].[CODE],
      @PACKAGENAME = [MKTPACKAGE].[NAME],
      @PACKAGEDESCRIPTION = [MKTPACKAGE].[DESCRIPTION],
      @SEGMENTNAME = [MKTSEGMENT].[NAME]
    from dbo.[MKTSEGMENTATIONSEGMENT]
    inner join dbo.[MKTPACKAGE] on [MKTPACKAGE].[ID] = [MKTSEGMENTATIONSEGMENT].[PACKAGEID]
    inner join dbo.[MKTSEGMENTATIONPACKAGE] on [MKTSEGMENTATIONPACKAGE].[PACKAGEID] = [MKTPACKAGE].[ID] and [MKTSEGMENTATIONPACKAGE].[SEGMENTATIONID] = @MAILINGID
    inner join dbo.[MKTSEGMENT] on [MKTSEGMENT].[ID] = [MKTSEGMENTATIONSEGMENT].[SEGMENTID]
    where [MKTSEGMENTATIONSEGMENT].[ID] = @SEGMENTID;


  declare @LISTNAME nvarchar(100);

  if @USEFINDERFILE = 0
    begin
      if exists(select [ID] from dbo.[MKTSEGMENTLIST] where [QUERYVIEWCATALOGID] = @DONORQUERYVIEWCATALOGID)
        begin
          -- This finder number came from a list, so get the record source for the list

          select
            @RECORDSOURCEID_INTERNAL = [MKTLIST].[RECORDSOURCEID],
            @LISTNAME = [MKTLIST].[NAME]
          from dbo.[MKTSEGMENTLIST]
          inner join dbo.[MKTLIST] on [MKTLIST].[ID] = [MKTSEGMENTLIST].[LISTID]
          where [MKTSEGMENTLIST].[QUERYVIEWCATALOGID] = @DONORQUERYVIEWCATALOGID;

          -- Check if this person has already been matched back for this list.  If they have, then return their record source donor ID as well. 

          -- Do not add a SEGMENTATIONID filter to this.  If the list person has ever been matched back to any mailing, then use that ID.

          -- If they've been matched back, then grab their matched back ID.

          set @SQL = 'select' + char(13) +
                     '  @CONSTITUENTID = cast([DONORID] as nvarchar(36))' + char(13) +
                     'from dbo.[' + dbo.[UFN_MKTRECORDSOURCE_MAKEMATCHBACKTABLENAME](@RECORDSOURCEID_INTERNAL) + ']' + char(13) +
                     'where [ID] = @DONORID';

          set @PARAMS = '@DONORID nvarchar(36), @CONSTITUENTID nvarchar(36) output';

          exec sp_executesql @SQL, @PARAMS, @DONORID = @DONORID, @CONSTITUENTID = @CONSTITUENTID output;
        end
      else
        begin
          -- This finder number came from a record source

          set @RECORDSOURCEID_INTERNAL = @DONORQUERYVIEWCATALOGID;
          set @CONSTITUENTID = @DONORID;
        end
    end


  -- If the record source we found for the finder number does not match the record source passed in, then this finder number

  -- belongs to a different set of data, so don't return any information.

  /* FINDER NUMBER LOOKUP */
  -- It'll fall in here too for Finder File Lookup - having failed the List test.

  /* FINDER NUMBER LOOKUP */

  if @RECORDSOURCEID_INTERNAL = @RECORDSOURCEID
    begin
      declare @QUERYVIEWOBJECTNAME nvarchar(128);

      /* FINDER NUMBER LOOKUP */
      -- the Finder File table will share field names with the parent query view,

      --  we just need to swap out the PRIMARK KEY FIELD (always ID in the FINDER FILE) and

      --  the QUERYVIEWOBJECTNAME, which should be built by dbo.[UFN_MKTFINDERFILE_BUILDTABLENAME](@MAILINGID)

      if @USEFINDERFILE=0
        select
          @QUERYVIEWOBJECTNAME = [OBJECTNAME],
          @PRIMARYKEYFIELD = [PRIMARYKEYFIELD]
        from dbo.[QUERYVIEWCATALOG]
        where [ID] = @DONORQUERYVIEWCATALOGID;
      else 
        begin
          if @FINDERFILEHASCONSTITUENTID = 1
            --If we have a constituent ID, then pull the info from the record source query view...

            select
              @QUERYVIEWOBJECTNAME = [OBJECTNAME],
              @PRIMARYKEYFIELD = [PRIMARYKEYFIELD]
            from dbo.[QUERYVIEWCATALOG]
            where [ID] = @DONORQUERYVIEWCATALOGID;
          else
            begin
              --If we don't have a constituent ID, then pull the info from the finder file table...

              set @QUERYVIEWOBJECTNAME = @FINDERFILETABLE;
              set @PRIMARYKEYFIELD = 'ID';
            end

          set @LISTNAME = 'finder file';
        end;
      /* FINDER NUMBER LOOKUP */


      declare @FULLNAMEFIELD nvarchar(255);
      declare @FIRSTNAMEFIELD nvarchar(255);
      declare @MIDDLENAMEFIELD nvarchar(255);
      declare @LASTNAMEFIELD nvarchar(255);
      declare @TITLEFIELD nvarchar(255);
      declare @SUFFIXFIELD nvarchar(255);
      declare @COUNTRYFIELD nvarchar(255);
      declare @ADDRESSLINE1FIELD nvarchar(255);
      declare @ADDRESSLINE2FIELD nvarchar(255);
      declare @ADDRESSLINE3FIELD nvarchar(255);
      declare @ADDRESSLINE4FIELD nvarchar(255);
      declare @ADDRESSLINE5FIELD nvarchar(255);
      declare @CITYFIELD nvarchar(255);
      declare @STATEFIELD nvarchar(255);
      declare @POSTCODEFIELD nvarchar(255);
      declare @CARTFIELD nvarchar(255);
      declare @DPCFIELD nvarchar(255);
      declare @LOTFIELD nvarchar(255);
      declare @PHONENUMBERFIELD nvarchar(255);
      declare @EMAILADDRESSFIELD nvarchar(255);
      declare @TITLE2FIELD nvarchar(255);
      declare @SUFFIX2FIELD nvarchar(255);

      -- Get the field names for the mapped record source fields

      select
        @FULLNAMEFIELD = [FULLNAMEFIELD],
        @FIRSTNAMEFIELD = [FIRSTNAMEFIELD],
        @MIDDLENAMEFIELD = [MIDDLENAMEFIELD],
        @LASTNAMEFIELD = [LASTNAMEFIELD],
        @TITLEFIELD = [TITLEFIELD],
        @SUFFIXFIELD = [SUFFIXFIELD],
        @COUNTRYFIELD = [COUNTRYFIELD],
        @ADDRESSLINE1FIELD = [ADDRESSLINE1FIELD],
        @ADDRESSLINE2FIELD = [ADDRESSLINE2FIELD],
        @ADDRESSLINE3FIELD = [ADDRESSLINE3FIELD],
        @ADDRESSLINE4FIELD = [ADDRESSLINE4FIELD],
        @ADDRESSLINE5FIELD = [ADDRESSLINE5FIELD],
        @CITYFIELD = [CITYFIELD],
        @STATEFIELD = [STATEFIELD],
        @POSTCODEFIELD = [POSTCODEFIELD],
        @CARTFIELD = [CARTFIELD],
        @DPCFIELD = [DPCFIELD],
        @LOTFIELD = [LOTFIELD],
        @PHONENUMBERFIELD = [PHONENUMBERFIELD],
        @EMAILADDRESSFIELD = [EMAILADDRESSFIELD],
        @TITLE2FIELD = [TITLE2FIELD],
        @SUFFIX2FIELD  = [SUFFIX2FIELD]
      from dbo.[MKTRECORDSOURCEFIELDMAPPINGS]
      where [ID] = @RECORDSOURCEID_INTERNAL;

      set @CONSTITUENTID = isnull(@CONSTITUENTID, '');
      set @SOURCECODE = isnull(@SOURCECODE, '');
      set @APPEALSYSTEMID = isnull(@APPEALSYSTEMID, '');
      set @APPEALID = isnull(@APPEALID, '');
      set @APPEALDESCRIPTION = isnull(@APPEALDESCRIPTION, '');
      set @PACKAGECODE = isnull(@PACKAGECODE, '');
      set @PACKAGENAME = isnull(@PACKAGENAME, '');
      set @PACKAGEDESCRIPTION = isnull(@PACKAGEDESCRIPTION, '');
      set @SEGMENTID = isnull(@TESTSEGMENTID, @SEGMENTID);
      set @SEGMENTNAME = isnull(@SEGMENTNAME, '');
      set @LISTNAME = isnull(@LISTNAME, '');

      -- Build the select statement to grab the bio information for this finder number based on the fields that actually exist in the query view.

      set @SQL = 'select' + char(13) +
                 '  ' + (case when @FINDERFILEHASCONSTITUENTID = 1 then '@DONORID' else '[' + @PRIMARYKEYFIELD + ']' end) + ' as [ID],' + char(13) +
                 '  @CONSTITUENTID as [CONSTITUENTID],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @FULLNAMEFIELD)
        set @SQL = @SQL + '  [' + @FULLNAMEFIELD + '] as [FULLNAME],' + char(13);
      else
        set @SQL = @SQL + '  null as [FULLNAME],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @FIRSTNAMEFIELD)
        set @SQL = @SQL + '  [' + @FIRSTNAMEFIELD + '] as [FIRSTNAME],' + char(13);
      else
        set @SQL = @SQL + '  null as [FIRSTNAME],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @MIDDLENAMEFIELD)
        set @SQL = @SQL + '  [' + @MIDDLENAMEFIELD + '] as [MIDDLENAME],' + char(13);
      else
        set @SQL = @SQL + '  null as [MIDDLENAME],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @LASTNAMEFIELD)
        set @SQL = @SQL + '  [' + @LASTNAMEFIELD + '] as [LASTNAME],' + char(13);
      else
        set @SQL = @SQL + '  null as [LASTNAME],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @TITLEFIELD)
        set @SQL = @SQL + '  [' + @TITLEFIELD + '] as [TITLE],' + char(13);
      else
        set @SQL = @SQL + '  null as [TITLE],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @SUFFIXFIELD)
        set @SQL = @SQL + '  [' + @SUFFIXFIELD + '] as [SUFFIX],' + char(13);
      else
      set @SQL = @SQL + '  null as [SUFFIX],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @COUNTRYFIELD)
        set @SQL = @SQL + '  [' + @COUNTRYFIELD + '] as [COUNTRY],' + char(13);
      else
        set @SQL = @SQL + '  null as [COUNTRY],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @ADDRESSLINE1FIELD)
        set @SQL = @SQL + '  [' + @ADDRESSLINE1FIELD + '] as [ADDRESSLINE1],' + char(13);
      else
        set @SQL = @SQL + '  null as [ADDRESSLINE1],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @ADDRESSLINE2FIELD)
        set @SQL = @SQL + '  [' + @ADDRESSLINE2FIELD + '] as [ADDRESSLINE2],' + char(13);
      else
        set @SQL = @SQL + '  null as [ADDRESSLINE2],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @ADDRESSLINE3FIELD)
        set @SQL = @SQL + '  [' + @ADDRESSLINE3FIELD + '] as [ADDRESSLINE3],' + char(13);
      else
        set @SQL = @SQL + '  null as [ADDRESSLINE3],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @ADDRESSLINE4FIELD)
        set @SQL = @SQL + '  [' + @ADDRESSLINE4FIELD + '] as [ADDRESSLINE4],' + char(13);
      else
        set @SQL = @SQL + '  null as [ADDRESSLINE4],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @ADDRESSLINE5FIELD)
        set @SQL = @SQL + '  [' + @ADDRESSLINE5FIELD + '] as [ADDRESSLINE5],' + char(13);
      else
        set @SQL = @SQL + '  null as [ADDRESSLINE5],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @CITYFIELD)
        set @SQL = @SQL + '  [' + @CITYFIELD + '] as [CITY],' + char(13);
      else
        set @SQL = @SQL + '  null as [CITY],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @STATEFIELD)
        set @SQL = @SQL + '  [' + @STATEFIELD + '] as [STATE],' + char(13);
      else
        set @SQL = @SQL + '  null as [STATE],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @POSTCODEFIELD)
        set @SQL = @SQL + '  [' + @POSTCODEFIELD + '] as [POSTCODE],' + char(13);
      else
        set @SQL = @SQL + '  null as [POSTCODE],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @CARTFIELD)
        set @SQL = @SQL + '  [' + @CARTFIELD + '] as [CART],' + char(13);
      else
        set @SQL = @SQL + '  null as [CART],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @DPCFIELD)
        set @SQL = @SQL + '  [' + @DPCFIELD + '] as [DPC],' + char(13);
      else
        set @SQL = @SQL + '  null as [DPC],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @LOTFIELD)
        set @SQL = @SQL + '  [' + @LOTFIELD + '] as [LOT],' + char(13);
      else
        set @SQL = @SQL + '  null as [LOT],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @PHONENUMBERFIELD)
        set @SQL = @SQL + '  [' + @PHONENUMBERFIELD + '] as [PHONENUMBER],' + char(13);
      else
        set @SQL = @SQL + '  null as [PHONENUMBER],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @EMAILADDRESSFIELD)
        set @SQL = @SQL + '  [' + @EMAILADDRESSFIELD + '] as [EMAILADDRESS],' + char(13);
      else
        set @SQL = @SQL + '  null as [EMAILADDRESS],' + char(13);

      -- Append the mailing-related data

      set @SQL = @SQL +
                 '  @MAILINGIDINTEGER as [MAILINGIDINTEGER],' + char(13) +
                 '  @MAILDATE as [MAILDATE],' + char(13) +
                 '  @SOURCECODE as [SOURCECODE],' + char(13) +
                 '  @APPEALSYSTEMID as [APPEALSYSTEMID],' + char(13) +
                 '  @APPEALID as [APPEALID],' + char(13) +
                 '  @APPEALDESCRIPTION as [APPEALDESCRIPTION],' + char(13) +
                 '  @PACKAGECODE as [PACKAGECODE],' + char(13) +
                 '  @PACKAGENAME as [PACKAGENAME],' + char(13) +
                 '  @PACKAGEDESCRIPTION as [PACKAGEDESCRIPTION],' + char(13) +
                 '  @SEGMENTID as [SEGMENTID],' + char(13) +
                 '  @SEGMENTNAME as [SEGMENTNAME],' + char(13) +
                 '  @LISTNAME as [LISTNAME],' + char(13);

      --adding these fields in the middle so not to break compat on the datalist

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @TITLE2FIELD)
        set @SQL = @SQL + '  [' + @TITLE2FIELD + '] as [TITLE2],' + char(13);
      else
        set @SQL = @SQL + '  null as [TITLE2],' + char(13);

      if exists(select 1 from INFORMATION_SCHEMA.COLUMNS where [TABLE_NAME] = @QUERYVIEWOBJECTNAME and [COLUMN_NAME] = @SUFFIX2FIELD)
        set @SQL = @SQL + '  [' + @SUFFIX2FIELD + '] as [SUFFIX2]' + char(13);
      else
        set @SQL = @SQL + '  null as [SUFFIX2]' + char(13);


      set @SQL += 'from dbo.[' + @QUERYVIEWOBJECTNAME + ']' + char(13) +
                  'where [' + @PRIMARYKEYFIELD + '] = ' + (case when @FINDERFILEHASCONSTITUENTID = 1 then '@CONSTITUENTID' else '@DONORID' end);

      set @PARAMS = '@CONSTITUENTID nvarchar(36), ' +
                    '@MAILINGIDINTEGER int, ' +
                    '@MAILDATE datetime, ' +
                    '@SOURCECODE nvarchar(50), ' +
                    '@APPEALSYSTEMID nvarchar(36), ' +
                    '@APPEALID nvarchar(100), ' +
                    '@APPEALDESCRIPTION nvarchar(100), ' +
                    '@PACKAGECODE nvarchar(10), ' +
                    '@PACKAGENAME nvarchar(100), ' +
                    '@PACKAGEDESCRIPTION nvarchar(255), ' +
                    '@SEGMENTID uniqueidentifier, ' +
                    '@SEGMENTNAME nvarchar(203), ' +
                    '@LISTNAME nvarchar(100), ' +
                    '@DONORID nvarchar(36)';

      exec sp_executesql @SQL, @PARAMS,
        @CONSTITUENTID = @CONSTITUENTID,
        @MAILINGIDINTEGER = @MAILINGIDINTEGER,
        @MAILDATE = @MAILDATE,
        @SOURCECODE = @SOURCECODE,
        @APPEALSYSTEMID = @APPEALSYSTEMID,
        @APPEALID = @APPEALID,
        @APPEALDESCRIPTION = @APPEALDESCRIPTION,
        @PACKAGECODE = @PACKAGECODE,
        @PACKAGENAME = @PACKAGENAME,
        @PACKAGEDESCRIPTION = @PACKAGEDESCRIPTION,
        @SEGMENTID = @SEGMENTID,
        @SEGMENTNAME = @SEGMENTNAME,
        @LISTNAME = @LISTNAME,
        @DONORID = @DONORID;
    end;

  return 0;