MS SQL Server结果生成HTML表格并发送邮件

配置邮件服务器

在SQL管理器中找到“管理”,在“数据库邮件”上面右键,选择“配置数据库邮件”,如果没有开启,系统会提示开启。


进去之后配置好账户和配置文件


生成HTML表格

使用SQL的XML功能生成表格,需要格式的话可以使用Style来设置,示例:
[sql]  view plain  copy
  1. DECLARE @emailBody NVARCHAR(MAX);      
  2. SET @emailBody = N'<style>table{table-layout:fixed;width:1200px;border:1px solid #000000;border-collapse:collapse;font-size:12px;empty-cells:show;}'  
  3.     + N'th,td{border:1px solid #000000;padding:3px;}</style>'  
  4.     + N'<H2>' + @cHandler + '在'  
  5.     + CONVERT(VARCHAR(19), @dnverifytime, 120)  
  6.     + '审核的采购入库单《' + @cCode  
  7.     + '》发生超采购订单收货情况</H2>' --标题     
  8.     + N'<table>' + N'<thead><tr>'  
  9.     + N'<th style="width:80px;">采购订单</th>'  
  10.     + N'<th style="width:90px;">存货编码</th>'  
  11.     + N'<th style="width:350px;">存货名称</th>'  
  12.     + N'<th style="width:150px;">规格</th>'  
  13.     + N'<th style="width:80px;">订单数量</th>'  
  14.     + N'<th style="width:80px;">已收数量</th>'  
  15.     + N'<th style="width:80px;">超收数量</th>'  
  16.     + N'<th style="width:60px;">单位</th>'  
  17.     + N'<th style="width:80px;">超收率</th>'  
  18.     + N'<th style="width:60px;">采购员</th>'  
  19.     + N'</tr></thead><tbody>'  --表头     
  20.     + CAST(( SELECT poM.cPOID AS td ,  
  21.                     '' ,  
  22.                     inv.cInvCode AS td ,  
  23.                     '' ,  
  24.                     inv.cInvName AS td ,  
  25.                     '' ,  
  26.                     ISNULL(inv.cInvStd, ' ') td ,  
  27.                     '' ,  
  28.                     '<div style="text-align:right;">'  
  29.                     + CAST(CAST(po.iQuantity AS DECIMAL(20,  
  30.                               4)) AS VARCHAR(20))  
  31.                     + '</div>' AS td ,  
  32.                     '' ,  
  33.                     '<div style="text-align:right;">'  
  34.                     + CAST(CAST(po.iReceivedQTY AS DECIMAL(20,  
  35.                               4)) AS VARCHAR(20))  
  36.                     + '</div>' AS td ,  
  37.                     '' ,  
  38.                     '<div style="text-align:right;">'  
  39.                     + CAST(CAST(po.iReceivedQTY  
  40.                     - po.iQuantity AS DECIMAL(20,  
  41.                               4)) AS VARCHAR(20))  
  42.                     + '</div>' AS td ,  
  43.                     '' ,  
  44.                     unit.cComUnitName AS td ,  
  45.                     '' ,  
  46.                     '<div style="text-align:right;">'  
  47.                     + CAST(CAST(( po.iReceivedQTY  
  48.                               - po.iQuantity )  
  49.                     * 100 / po.iQuantity AS DECIMAL(18,  
  50.                               2)) AS VARCHAR(20))  
  51.                     + '%</div>' AS td ,  
  52.                     '' ,  
  53.                     poM.cMaker td ,  
  54.                     ''  
  55.              FROM   Inserted i  
  56.                     INNER JOIN dbo.rdrecords01 d ON i.ID = d.ID  
  57.                     INNER JOIN PO_Podetails po ON d.iPOsID = po.ID  
  58.                     INNER JOIN dbo.PO_Pomain poM ON poM.POID = po.POID  
  59.                     INNER JOIN dbo.Inventory inv ON inv.cInvCode = d.cInvCode  
  60.                     INNER JOIN dbo.ComputationUnit unit ON unit.cComunitCode = inv.cComUnitCode  
  61.              WHERE  po.iReceivedQTY > po.iQuantity  
  62.            FOR  
  63.              XML PATH('tr') ,  
  64.                  TYPE  
  65.            ) AS NVARCHAR(MAX))  
  66.     + N'</tbody></table>';   

因为生成XML时会对<>等标签进行编码,所以还需要进一步替换:
[sql]  view plain  copy
  1. SELECT  @emailBody = REPLACE(REPLACE(@emailBody,  
  2.                               '&lt;''<'),  
  3.                              '&gt;''>');  

发邮件

一下步就是把生成的内容通过邮件发送出去了:
[sql]  view plain  copy
  1. EXEC msdb.dbo.sp_send_dbmail @profile_name = 'dgml',  
  2.     @recipients = @recipientsList,  
  3.     @subject = '超采购订单收货提醒!',  
  4.     @body = @emailBody, @body_format = 'html';  

上面的收件人可以直接拼出来,也可以从数据库里面取出来,下面是取数据库内容,每个收件人的格式:人名<邮件地址>,多个收件人之间用;隔开
[sql]  view plain  copy
  1. DECLARE @recipientsList NVARCHAR(MAX);  --收件人  
  2. SELECT  @recipientsList = REPLACE(REPLACE(STUFF(( SELECT  
  3.                                       ';'  
  4.                                       + u.cUser_Name  
  5.                                       + '<'  
  6.                                       + u.cUserEmail  
  7.                                       + '>'  
  8.                                       FROM  
  9.                                       dbo.WG_Subscription_Users su  
  10.                                       INNER JOIN dbo.UserHrPersonContro up ON up.cPsn_Num = su.cPsn_Num  
  11.                                       INNER JOIN UFSystem.dbo.UA_User u ON u.cUser_Id = up.cUser_Id  
  12.                                       WHERE  
  13.                                       su.subscriptionID = 1  
  14.                                       AND ISNULL(u.cUserEmail,  
  15.                                       '') <> ''  
  16.                                       FOR  
  17.                                       XML  
  18.                                       PATH('')  
  19.                                       ), 1, 1, ''),  
  20.                                       '&lt;''<'),  
  21.                                   '&gt;''>');  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值