2016-04-10 19 views
3

Saklı yordamım için bir XML alıyorum ve bunun üzerine yinelemeliyim ve XML'e göre e-postalar göndermem gerekiyor.XML düğümleri üzerinde yineleyin ve SQL Server'da e-posta gönderin

Sadece e-posta göndermek için başka bir saklı yordam vardır: İşte

MailingSystem..SP_SendEmail 
       @Cc = N'', -- nvarchar(500) 
       @Bcc = N'', -- nvarchar(500) 
       @FromEMailAddress = N'', -- nvarchar(500) 
       @ReplyToEMailAddress = N'', -- nvarchar(500) 
       @Subject = N'', -- nvarchar(500) 
       @EmailRecipient = N'', -- nvarchar(500) 
       @ContentType = N'', -- nvarchar(50) 
       @Content = N'', -- nvarchar(max) 

XML yapısı şöyledir: Her EmailMessage düğüm üzerinde döngü istiyorum

DECLARE @XMLData XML =   
     '<GenericXML> 
      <GenericEmailsNotification> 
       <EmailMessage> 
        <From>[email protected]</From> 
        <Recipients>[email protected]</Recipients> 
        <CC>[email protected]</CC> 
        <Subject>Follow The Sun </Subject> 
        <Body>Breathe, breathe in the air. Set your intentions.Dream with care. </Body> 
       </EmailMessage> 
       <EmailMessage> 
        <From>[email protected]</From> 
        <Recipients>[email protected]</Recipients> 
        <Subject>Second Email is best</Subject> 
        <Body>Second Email body...</Body> 
       </EmailMessage> 
      </GenericEmailsNotification> 
     </GenericXML>' 

ve ilgili veri ayıklamak bu düğüme/e-postaya (Konu, Kimden, Alıcılar, Gövde vb.) ve postayı göndermekle yükümlü olan saklı yordamına gönderin.

Her bir XML

Bunu nasıl yapabilirim (.. şu ana kadar onun temizlemez ise) göndermek için birden çok e-postalar olabilir? XML öğeleri üzerinde döngü yapmak için herhangi bir yolu var mı? peşin

Teşekkür

cevap

3

Sen XML ayrıştırmak ve kullanabilirsiniz imleci:

DECLARE @XMLData XML =   
'<GenericXML> 
    <GenericEmailsNotification> 
    <EmailMessage> 
     <From>[email protected]</From> 
     <Recipients>[email protected]</Recipients> 
     <CC>[email protected]</CC> 
     <Subject>Follow The Sun </Subject> 
     <Body>Breathe,breathe in the air.Set your intentions.Dream with care</Body> 
    </EmailMessage> 
    <EmailMessage> 
     <From>[email protected]</From> 
     <Recipients>[email protected]</Recipients> 
     <Subject>Second Email is best</Subject> 
     <Body>Second Email body...</Body> 
    </EmailMessage> 
    </GenericEmailsNotification> 
</GenericXML>' ; 

Sorgu:

SELECT [from]  = s.c.value('(./From)[1]', 'nvarchar(250)') 
     ,[Recipients] = s.c.value('(./Recipients)[1]', 'nvarchar(250)') 
     ,[CC]   = s.c.value('(./CC)[1]', 'nvarchar(250)') 
     ,[Subject] = s.c.value('(./Subject)[1]', 'nvarchar(250)') 
     ,[body]  = s.c.value('(./Body)[1]', 'nvarchar(MAX)') 
INTO #Emails  
FROM @XMLData.nodes('/GenericXML/GenericEmailsNotification/EmailMessage') 
    AS s(c); 

DECLARE cur CURSOR LOCAL FAST_FORWARD FOR 
SELECT [from],[Recipients],[CC],[Subject],[body] FROM #Emails; 

DECLARE @from  NVARCHAR(250), 
     @recipients NVARCHAR(250), 
     @cc   NVARCHAR(250), 
     @subject NVARCHAR(250), 
     @body  NVARCHAR(MAX); 

OPEN cur; 
FETCH NEXT FROM cur INTO @from, @recipients, @cc, @subject, @body; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    -- send email, pass variables to SP call, handle `NULL` with `ISNULL` if needed 
    -- EXEC MailingSystem..SP_SendEmail @Subject = @subject, ... 

    SELECT 'Send email in cursor loop:', @from, @recipients, @cc, @subject, @body; 

    FETCH NEXT FROM cur INTO @from, @recipients, @cc, @subject, @body; 
END 

CLOSE cur; 
DEALLOCATE cur; 

LiveDemo

+0

İhtiyacım olan bir şey, bu kodun en sonunda "Tablo # E-postaları Bırak" dır. Aksi takdirde ilk çalıştırmadan sonra #Emails zaten bir nesne var olduğunu söyle. Bunun dışında iki başparmak yukarıya! – Ron