前段时间因工作需求,特地学习了下sp_send_dbmail的使用,发现网上的示例对我这样的菜鸟太不友好/(ㄒoㄒ)/~~,好不容易完工来和大家分享一下,不谈理论,只管实践!

如下是实际需求:

-- =============================================
-- Title: 集团资质一览表
-- Description1:<1、距离到期日期1年内和已过期的发到期提醒>
-- Description2:<2、表头【非附件】:公司名称、发证部门、证书名称、类别、等级、到期日期、预警级别>
-- Description3:<3、预警级别:假设距离到期日期月数为N。一级:N<=3;二级:3<N<=6;三级:N>=6>
-- Description4:<4、提醒人员:邮件提醒
-- =============================================

在这里sp_send_dbmail的参数不去做详述(我也不懂~),实际过程中我们需要用到的并不多,只需下面几行就能发送html格式的邮件了

  1. Exec dbo.sp_send_dbmail
  2. @profile_name='crm***', --发件人姓名
  3. @recipients='156240***@qq.com', --邮箱(多个用;隔开)
  4. @body=@tableHTML, --消息主体
  5. @body_format='HTML', --指定消息的格式,一般文本直接去掉即可,发送html格式的内容需加上
  6. @subject ='资质到期预警'; -- 消息的主题

下面最主要的部分就是@tableHTML了,在这里我们使用两种方式去拼接html。

1.通过sql CAST 函数,网上的示例大多数是这种,愚笨的我不太看的懂,只能依瓢画葫。

  1. declare @tableHTML varchar(max)
  2. SET @tableHTML =
  3. N'<H1 style="text-align:center">资质相关信息</H1>' +
  4. N'<table border="1" cellpadding="3" cellspacing="0" align="center">' +
  5. N'<tr><th width=100px" >公司名称</th>'+
  6. N'<th width=250px>发证部门</th><th width=150px>证书名称</th>'+
  7. N'<th width=50px>类别</th><th width=50px>等级</th>'+
  8. N'<th width=60px>到期日期</th><th width=60px>预警级别</th></tr>'+
  9. CAST ( (
  10. select td = p.CompanyName, '',td = p.DeptName, '',td=p.Name,'', td = p.QualificationType, '',td = p.Level, '',td = p.ExpireDates, '',td=p.YJ,''
  11. from(
  12. select
  13. CompanyName,DeptName,Name,QualificationType,Level,Convert(varchar(50),ExpireDate,111)ExpireDates,
  14. case when DATEDIFF(mm,getDate(),ExpireDate)<=3 then '一级预警'
  15. when DATEDIFF(mm,getDate(),ExpireDate)<=6 then '二级预警' else '三级预警'end YJ
  16. from T_Market***_JTZZ
  17. where 12>=DATEDIFF(mm,getDate(),ExpireDate)
  18. ) p order by p.ExpireDates asc
  19. FOR XML PATH('tr'), TYPE
  20. ) AS NVARCHAR(MAX) ) +
  21. N'</table>' ;
  22.  
  23. Exec dbo.sp_send_dbmail
  24. @profile_name='crm***',
  25. @recipients = '156240***@qq.com',
  26. @subject='资质到期预警',
  27. @body=@tableHTML,
  28. @body_format = 'HTML' ;

2.通过游标动态绘制html,感觉这种更方便,虽然写起来有点啰嗦,但很灵活。

  1. BEGIN
  2. declare @tableHTML varchar(max)
  3. declare @Companyname varchar(250) --公司名称
  4. declare @Deptname varchar(250) --发证部门
  5. declare @Certname varchar(250) --证书名称
  6. declare @Certtype varchar(50) --证书类别
  7. declare @Certlevel varchar(50) --证书等级
  8. declare @Expirdate varchar(20) --到期时间
  9. declare @Warnlevel varchar(20) --预警级别
  10.  
  11. begin
  12. set @tableHTML = '<html><body><table><tr><td><p><font color="#000080" size="3" face="Verdana">您好!</font></p><p style="margin-left:30px;"><font size="3" face="Verdana">以下资质即将到期或已过期,请尽快办理资质延续:</font></p></td></tr>';
  13. --创建临时表#tbl_result
  14. create table #tbl_result(companyname varchar(250),deptname varchar(250),certname varchar(250),certtype varchar(50),certlevel varchar(50),expirdate varchar(20),warnlevel varchar(10));
  15. insert into #tbl_result
  16. select CompanyName,DeptName,Name,QualificationType,Level,convert(varchar(20),ExpireDate,23) ExpireDate,case when ms<=3 then '一级' when ms>3 and ms<=6 then '二级' else '三级' end warnlevel
  17. from (
  18. select *,Datediff(MONTH,GETDATE(),ExpireDate) ms
  19. from T_Market***_JTZZ
  20. where ExpireDate is not null and Datediff(MONTH,GETDATE(),ExpireDate)<=12
  21. ) res;
  22.  
  23. declare @counts int;
  24. select @counts=count(*) from #tbl_result;
  25. --- 提醒列表
  26. if(@counts>0)
  27. begin
  28. set @tableHTML=@tableHTML+'<tr><td><table border="1" style="border:1px solid #d5d5d5;border-collapse:collapse;border-spacing:0;margin-left:30px;margin-top:20px;"><tr style="height:25px;background-color: rgb(219, 240, 251);"><th style="width:100px;">公司名称</th><th style="width:200px;">发证部门</th><th>证书名称</th><th style="width:60px;">类别</th><th style="width:80px;">等级</th><th style="width:100px;">到期日期</th><th style="width:80px;">预警级别</th></tr>';
  29. --申明游标
  30. Declare cur_cert Cursor for
  31. select companyname,deptname,certname,certtype,certlevel,expirdate,warnlevel from #tbl_result order by expirdate;
  32. --打开游标
  33. open cur_cert
  34. --循环并提取记录
  35. Fetch Next From cur_cert Into @Companyname,@Deptname,@Certname,@Certtype,@Certlevel,@Expirdate,@Warnlevel
  36. While (@@Fetch_Status=0)
  37. begin
  38. set @tableHTML = @tableHTML + '<tr><td align="center">'+@Companyname+'</td>';
  39. set @tableHTML = @tableHTML + '<td align="center">'+@Deptname+'</td>';
  40. set @tableHTML = @tableHTML + '<td align="center">'+@Certname+'</td>';
  41. set @tableHTML = @tableHTML + '<td align="center">'+@Certtype+'</td>';
  42. set @tableHTML = @tableHTML + '<td align="center">'+@Certlevel+'</td>';
  43. set @tableHTML = @tableHTML + '<td align="center">'+@Expirdate+'</td>';
  44. set @tableHTML = @tableHTML + '<td align="center">'+@Warnlevel+'</td></tr>';
  45. --继续遍历下一条记录
  46. Fetch Next From cur_cert Into @Companyname,@Deptname,@Certname,@Certtype,@Certlevel,@Expirdate,@Warnlevel
  47. end
  48. --关闭游标
  49. Close cur_cert
  50. --释放游标
  51. Deallocate cur_cert
  52. set @tableHTML = @tableHTML + '</table></td></tr>';
  53. end
  54.  
  55. -- 发送邮件
  56. exec msdb.dbo.sp_send_dbmail
  57. @profile_name='crm***',
  58. @recipients='156240***@qq.com',
  59. @body=@tableHTML,
  60. @body_format='HTML',
  61. @subject ='资质到期预警';
  62.  
  63. -- 删除临时表(#tbl_result)
  64. if object_id('tempdb..#tbl_result') is not null
  65. begin
  66. drop table #tbl_result;
  67. end
  68. end
  69.  
  70. END

看起来无疑第二中特别啰嗦,但个人感觉很好理解,游标拼接html部分思路很清楚,以上两个方式均经过实践,如需使用只需要将其中对应的字段、数据源替换掉即可,感谢诸位赏足,有什么不足之处还望大家见谅,本人菜鸟,无需鉴定~

sqlserver存储过程sp_send_dbmail邮件(html)实际应用的更多相关文章

  1. SQLServer 存储过程+定时任务发邮件

    SQLServer 代理发邮件需要开启SQL Server 代理服务器,然后,在[管理]-[数据库邮件]中,右键点击配置数据库邮件. 我用的是腾讯的企业邮箱,个人的163邮箱略微不同.下图是相关邮件的 ...

  2. JSON序列化及利用SqlServer系统存储过程sp_send_dbmail发送邮件(一)

    JSON序列化 http://www.cnblogs.com/yubaolee/p/json_serialize.html 利用SqlServer系统存储过程sp_send_dbmail发送邮件(一) ...

  3. 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)

    解剖SQLSERVER 第十五篇  SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...

  4. Sqlserver 存储过程中结合事务的代码

    Sqlserver 存储过程中结合事务的代码  --方式一 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ ...

  5. SqlServer存储过程学习笔记(增删改查)

    * IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...

  6. SQLServer 存储过程嵌套事务处理

    原文:SQLServer 存储过程嵌套事务处理 某个存储过程可能被单独调用,也可能由其他存储过程嵌套调用,则可能会发生嵌套事务的情形. 下面是一种解决存储过程嵌套调用的通用代码,在不能确定存储过程是否 ...

  7. 创建并在项目中调用SQLSERVER存储过程的简单示例

    使用SQLSERVER存储过程可以很大的提高程序运行速度,简化编程维护难度,现已得到广泛应用.创建存储过程 和数据表一样,在使用之前需要创建存储过程,它的简明语法是: 引用: Create PROC ...

  8. SQLSERVER存储过程语法详解

    CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ...

  9. SqlServer存储过程详解

    SqlServer存储过程详解 1.创建存储过程的基本语法模板: if (exists (select * from sys.objects where name = 'pro_name')) dro ...

随机推荐

  1. IIS+NGINX 负载web服务器

    Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在 ...

  2. PB测款方法 店铺运费模板 设置

    https://www.wishhack.com/article/44.html 子账号有权限设置运费

  3. <文档学习>AirSim/using_car.md Choosing Your Vehicle: Car or Multirotor

    如何在AirSim中使用汽车 默认情况下,AirSim中使用的车型为多转子multirotor. 如果你想使用汽车,那么只需在你的settings.json(https://github.com/Mi ...

  4. Java框架部分---面试题

    说说Spring? Spring的核心是控制反转.依赖注入,Aop(面向切面)相当于把每个bean与bean之间的关系交给第 三方容器进行管理. 说SpringIOC.SpringAOP? Sprin ...

  5. eclipse工具类及插件(设置注释模板)

    (摘抄原地址)https://blog.csdn.net/xb12369/article/details/79850476(设置注释模板) 首先打开Eclipse配置选项:Window->Pre ...

  6. int类型129转byte类型得到-127的解释

    package com.yygc.zhen.codeing_base; /** * @author zhen * @Date 2019/2/22 10:03 * 类型转换 */ public clas ...

  7. WebView性能、体验分析与优化

    育新 徐宏 嘉洁 ·2017-06-09 20:03 在App开发中,内嵌WebView始终占有着一席之地.它能以较低的成本实现Android.iOS和Web的复用,也可以冠冕堂皇的突破苹果对热更新的 ...

  8. restful规范整理

    restful的十条规范 restful一共有十条规范,但其并不是规定.可以不去遵守,是一种软件风格 1.API与客户端交互,通常使用https协议 2.域名:https://api.baidu.co ...

  9. 利用ASK/OOK 发射模块,实现信号重放

    本文以打开无线控制的电动车库卷帘门为目标,深入研究了ASK/OOK的编/解码,并用树莓派+五元钱的ASK/OOK 发射模块 背景 车库装了电动卷帘门,为了了解其安全性,也是为了能自主控制,研究了下其遥 ...

  10. 关于Idea启动配置tomcat

    1.打开file中setting中搜索Application Servers,如下图 2.添加服务器类型,例如tomcat,如下图,添加完成之后可以选定tomcat的目录,tomcat Home配置t ...