2016-04-10 16 views
3

私はストアドプロシージャにXMLを取得しており、XMLにしたがって反復処理して電子メールを送信する必要があります。XMLノードを繰り返し処理し、SQL Serverで電子メールを送信

私はちょうど電子メールを送信するための別のストアドプロシージャを持っている:ここでは

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の構造である:

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>' 

私は各EmailMessageノードをループにしたいと関連するデータを抽出このノード/電子メール(件名、送信者、受信者、本文など)に送信し、メールを送信するストアドプロシージャに送信します。

各XMLを送信するために、複数の電子メールを持つことができます(その明確でない場合は、今まで...)

私はそれをどのように行うことができますか? XML要素をループする方法はありますか?事前に

おかげ

答えて

3

あなたはXMLを解析し、使用することができ、カーソル:

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>' ; 

問合せ:

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

私が必要としたことの1つは、そのコードの最後に "Drop Table #Emails"です。 それ以外の場合は、最初の実行後にオブジェクト#Emailsが既に存在することがわかります。 それ以外は、2つの親指! – Ron

関連する問題