草庐IT

sql - 遍历 XML 节点并在 SQL Server 中发送电子邮件

coder 2024-06-30 原文

我正在获取存储过程的 XML,我需要对其进行迭代并根据 XML 发送电子邮件。

我有另一个用于发送电子邮件的存储过程:

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>John@Google.com</From>
                     <Recipients>Naomi@Yahoo.com</Recipients>
                     <CC>Tania@HotMail.com</CC>
                     <Subject>Follow The Sun </Subject>
                     <Body>Breathe, breathe in the air. Set your intentions.Dream with care. </Body>
                 </EmailMessage>
                 <EmailMessage>
                     <From>ron@Google.com</From>
                     <Recipients>Fake@Yahoo.com</Recipients>
                     <Subject>Second Email is best</Subject>
                     <Body>Second Email body...</Body>
                 </EmailMessage>
             </GenericEmailsNotification>
         </GenericXML>' 

我想遍历每个 EmailMessage 节点并提取与该节点/电子邮件相关的数据(主题、发件人、收件人、正文等)并将其发送到负责的存储过程发送邮件。

每个 XML 可以有多个电子邮件要发送(如果到现在还不清楚..)

我该怎么做?有什么方法可以遍历 XML 元素?

提前致谢

最佳答案

您可以解析 XML 并使用游标:

DECLARE @XMLData XML =          
'<GenericXML>
  <GenericEmailsNotification>
    <EmailMessage>
      <From>John@Google.com</From>
      <Recipients>Naomi@Yahoo.com</Recipients>
      <CC>Tania@HotMail.com</CC>
      <Subject>Follow The Sun </Subject>
      <Body>Breathe,breathe in the air.Set your intentions.Dream with care</Body>
    </EmailMessage>
    <EmailMessage>
      <From>ron@Google.com</From>
      <Recipients>Fake@Yahoo.com</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

关于sql - 遍历 XML 节点并在 SQL Server 中发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36532548/

有关sql - 遍历 XML 节点并在 SQL Server 中发送电子邮件的更多相关文章

  1. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  4. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  5. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  6. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  7. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  8. ruby - Chef Ruby 遍历 .erb 模板文件中的属性 - 2

    所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP

  9. ruby - 是否可以在不实际发送或读取数据的情况下查明 ruby​​ 套接字是否处于 ESTABLISHED 或 CLOSE_WAIT 状态? - 2

    s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成

  10. ruby - 如何遍历 Ruby 中所有正则表达式匹配的字符串? - 2

    我们有一个字符串:“”这个正则表达式://i如何从当前字符串中获取所有匹配项? 最佳答案 "".scan(//)参见scan在ruby​​-docs上 关于ruby-如何遍历Ruby中所有正则表达式匹配的字符串?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6857852/

随机推荐