spGetEmailViewAsPermutations

Used to estimate the results of a conditional content e-mail.

Parameters

Parameter Parameter Type Mode Description
@StatKey nvarchar(1000) IN
@ConditionData xml IN
@TargetLists xml IN

Definition

Copy


CREATE procedure dbo.spGetEmailViewAsPermutations
(
    @StatKey nvarchar(1000),
    @ConditionData xml,
    @TargetLists xml
)
as
begin

    ----------- **** IMPORTANT **** --------------------

    ---- This SP contains a Temp table.  The SPGen Utility

    ---- cannot handle Temp tables due to a limitation in DataAdapter.FillSchema.

    ---- If you make changes to this SP and need to regen the file, you will have to

    ---- replace the temp table with a table variable. Then you can successfully regen this file.

    ---- Afterwards, you can switch back to a temp table.


    --Insert this new ke

    EXEC spAddUpdate_ConditionRecipientStatistics @StatKey, Null, 0

    Declare @ConditionBlockCondition Table (ID int, ConditionBlockID int, ConditionID int, Priority int)            
    INSERT @ConditionBlockCondition
    SELECT
        cd.cbc.value('(ID)[1]', 'int'),
        cd.cbc.value('(ConditionBlockID)[1]', 'int'),
        cd.cbc.value('(ConditionID)[1]', 'int'),
        cd.cbc.value('(Priority)[1]', 'int')
    FROM @ConditionData.nodes('/ConditionalContent/ConditionBlockCondition') cd(cbc)

    Declare @TargetList Table (EmailListID int)
    INSERT @TargetList
    SELECT
        tld.l.value('@ID', 'int')
    FROM @TargetLists.nodes('/TargetLists/List') tld(l)

    ----------------------------------

    -- Create a master recipient list-

    ----------------------------------

    CREATE TABLE #Recipient  (ID uniqueidentifier, EmailAddress nvarchar(256) COLLATE database_default  not null , PeopleID int null, ClientUserID int null)

    -- Insert people from query based lists

    INSERT INTO    #Recipient    
    SELECT NEWID(), elp.EmailAddress, elp.PeopleID, BOSU.ClientUsersID
    FROM [dbo].[EmailList_People] elp
    JOIN @TargetList tl
    ON tl.EmailListID = elp.EmailListID
    left outer join dbo.BackOfficeSystemUsers BOSU on BOSU.BackofficePeopleID = elp.ID                            
    WHERE Len(elp.EmailAddress) > 0
    GROUP BY elp.EmailAddress, elp.PeopleID, BOSU.ClientUsersID

    -- Insert people from Uploaded (Import) lists

    INSERT INTO    #Recipient    
    SELECT NEWID(), eluml.EmailAddress, NULL, NULL
    FROM [dbo].[EmailListUploadMasterList] eluml
    JOIN @TargetList tl
    ON tl.EmailListID = eluml.EmailListID    
    WHERE Len(eluml.EmailAddress) > 0

    -- Insert people from user defined lists

    INSERT INTO    #Recipient    
    SELECT NEWID(), elud.EmailAddress, NULL, NULL
    FROM [dbo].[EmailList_UserDefined] elud
    JOIN @TargetList tl
    ON tl.EmailListID = elud.EmailListID  
    WHERE Len(elud.EmailAddress) > 0

    -- Insert people from anonymous subscription lists

    INSERT INTO    #Recipient    
    SELECT NEWID(), els.EmailAddress, NULL, NULL
    FROM [dbo].[EmailList_Subscription] els
    JOIN @TargetList tl
    ON tl.EmailListID = els.EmailListID    
  WHERE UserID IS NULL AND HasOpted = 1 AND Len(els.EmailAddress) > 0

    -- Insert people from appeal lists

    declare @APPEALLISTID int = null
    select @APPEALLISTID = EL.ID
    from @TARGETLIST TL
    inner join dbo.EMAILLIST EL on EL.ID = TL.EMAILLISTID
    where EL.Datasourceid = 400

    if @APPEALLISTID is not null
    begin
        create table #APPEALEMAILLISTMEMBER (CONSTITUENTID uniqueidentifier, ANONYMOUSEMAILSUBSCRIBERID uniqueidentifier, EMAILADDRESS nvarchar(100) COLLATE database_default)

        exec dbo.USP_EMAILLIST_PROCESSAPPEALLIST @APPEALLISTID

        merge #Recipient as T
        using (select distinct EMAILADDRESS from #APPEALEMAILLISTMEMBER) as M
        on T.EMAILADDRESS = M.EMAILADDRESS collate database_default
        when not matched by target
        then insert (ID, EMAILADDRESS) values (NEWID(), EMAILADDRESS);

        drop table #APPEALEMAILLISTMEMBER
    end    

    -- Insert constituents from subscription lists

    INSERT INTO    #Recipient    
    SELECT NEWID(), cu.Email,  case els.BackofficeSystemPeopleID when 0 then null else els.BackofficeSystemPeopleID end, UserID
    FROM [dbo].[EmailList_Subscription] els
    JOIN @TargetList tl
    ON tl.EmailListID = els.EmailListID
    JOIN [dbo].[ClientUsers] cu
    ON cu.ID = els.UserID
    WHERE els.UserID IS NOT NULL AND els.HasOpted = 1 AND Len(cu.Email) > 0

    -- Insert people from Imported Users lists

    INSERT INTO    #Recipient    
    SELECT NEWID(), cu.Email, NULL, cu.ID
    FROM [dbo].[EmailList] el
    JOIN @TargetList tl
    ON tl.EmailListID = el.ID
    JOIN [dbo].[UserImportMasterList] uiml
    ON el.UserImportID = uiml.UserImportID
    JOIN [dbo].[clientusers] cu
    ON cu.ID = uiml.ClientUsersID
    WHERE cu.[Deleted] = 0 AND cu.[active]=1 AND len(cu.[Email]) > 0

    -- Insert all Netcom users if a NetCom list is selected

    DECLARE @netComListID int
    SET @netComListID = 0
    SET @netComListID = (Select top 1 el.id
                        FROM [dbo].[EmailList] el
                        JOIN @TargetList tl
                        ON tl.EmailListID = el.ID
                        WHERE el.DataSourceID = 101 AND el.UserImportID = 0)

    IF @netComListiD > 0 BEGIN
        INSERT INTO    #Recipient    
        SELECT NEWID(), Email, NULL, ID
        FROM [dbo].[clientusers]
        WHERE [Deleted] = 0 AND [active]=1 AND len([Email]) > 0
    END

    Create INDEX IX_Recipients_Address ON #Recipient(EmailAddress, ID)
    Create INDEX IX_Recipients_People ON #Recipient(PeopleID, ID)
    Create INDEX IX_Recipients_User ON #Recipient(ClientUserID, ID)

    Declare @messageCount int
    SELECT @messageCount = COUNT(1)
    FROM #Recipient r

    Create Table #Recipient_Priorities (RecipientID uniqueidentifier, BlockID INT, Priority INT)
    EXEC spGetConditionalPermutations null,@ConditionData,@TargetLists

    Create Index IX_Recipient_Priorities on #Recipient_Priorities (RecipientID, BlockID, Priority)

    DECLARE @counts varchar(8000)
    SET @counts = ''

    Declare ConditionCursor CURSOR LOCAL FAST_FORWARD FOR
  SELECT cbc.ID, bpc.RecipientCount
    FROM @ConditionBlockCondition cbc
    JOIN    (SELECT BlockID, Priority, Count(1) as RecipientCount
            FROM #Recipient_Priorities
            GROUP By BlockID, Priority) bpc
    ON  bpc.BlockID = cbc.ConditionBlockID
    AND bpc.Priority = cbc.Priority

    DECLARE @conditionID int
    DECLARE @recipCount int
    Open ConditionCursor
    FETCH NEXT FROM ConditionCursor
    INTO @conditionID, @recipCount

    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @counts = @counts + Convert(varchar(5), @conditionID) + ':' + Convert(varchar(10), @recipCount) + ';'

        FETCH NEXT FROM ConditionCursor
        INTO @conditionID, @recipCount
    END

    close ConditionCursor
    deallocate ConditionCursor

    SET @counts = @counts + Convert(varchar(10),@messageCount)                

    EXEC spAddUpdate_ConditionRecipientStatistics @StatKey, @counts, 1

    drop table #Recipient_Priorities

end