工作中经常需要用SQLServer发送报警或者业务报表邮件,每次现拼串也不是办法,故写了一个TableResult to HTML的存储过程

USE master;
GO
-- Description: Turns a table result into a formatted HTML table. Useful for emails.
-- Any ORDER BY clause needs to be passed in the separate ORDER BY parameter.
-- Author:zhangchuan
-- Date: 20180611
-- ====================How to use========================= CREATE PROC [dbo].[sp_TableToHtml]
(
@temptb nvarchar(MAX), --A temporary table to turn into HTML format. It should be begin with "#".
@orderBy nvarchar(MAX) = NULL, --An optional ORDER BY clause. It should contain the words 'ORDER BY'.
@html nvarchar(MAX) = NULL OUTPUT --The HTML output of the procedure.
)
AS
BEGIN
SET NOCOUNT ON;
IF @orderBy IS NULL SET @orderBy = '' ELSE SET @orderBy = REPLACE(@orderBy, '''', ''''''); DECLARE @ExecStr nvarchar(MAX)
SET @ExecStr='
SET @html =
N''<table border="1" style="font-size:12pt; font-family:verdana; text-align:right">'' +
N''<tr style="font-weight:bold">''
SET @html = @html + '
DECLARE @ColStr VARCHAR(MAX)
SELECT @ColStr=ISNULL(@ColStr+'<th>'+name+'</th>','<th>'+name+'</th>')
FROM tempdb.sys.columns
WHERE object_id=(SELECT TOP 1 object_id FROM tempdb.sys.tables WHERE name like '%'+@temptb+'%' ORDER BY create_date DESC) ORDER BY column_id SET @ExecStr=@ExecStr+'N'''+@ColStr+'''' SET @ExecStr=@ExecStr+'
SET @html = @html + N''</tr>''
'
DECLARE @RowStr VARCHAR(MAX)
SELECT @RowStr=ISNULL(@RowStr+' ,td = LTRIM(ISNULL(['+name+'],0)),''''',',td = LTRIM(ISNULL(['+name+'],0)),''''')+CHAR(13)
FROM tempdb.sys.columns
WHERE object_id=(SELECT TOP 1 object_id FROM tempdb.sys.tables WHERE name like '%'+@temptb+'%' ORDER BY create_date DESC) ORDER BY column_id SET @ExecStr = @ExecStr+' SET @html=@html+CAST(
(SELECT
'
+ STUFF(@RowStr,1,1,'')
+'
FROM '+@temptb+' '+@orderBy+'
FOR XML PATH(''tr''), TYPE
) AS NVARCHAR(MAX)
)
SET @html=replace(@html,''&lt;'',''<'')
SET @html=replace(@html,''&gt;'',''>'') SET @html=@html+N''</table>''+CHAR(13)
'
--PRINT @ExecStr
EXEC sys.sp_executesql @ExecStr, N'@html nvarchar(MAX) OUTPUT', @html=@html OUTPUT
END
GO

使用方法:

USE [master]
GO
IF OBJECT_ID('TEMPDB.DBO.#EndList') IS NOT NULL DROP TABLE #EndList --insert into temp table
SELECT TOP 10 *
INTO #EndList
FROM [DB_Monitor].[dbo].[T_dm_os_waiting_tasks] --Table to html
DECLARE @html nvarchar(MAX);
EXEC [sp_TableToHtml] @html = @html OUTPUT, @temptb = N'#EndList', @orderBy = N'ORDER BY 1'; --send the email
IF @html IS NOT NULL
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'DBA_Profile',
@recipients = 'zc_0101@163.com;',
--@blind_copy_recipients = 'zc_0101@163.com',
@subject = 'HTML email',
@body = @html,
@body_format = 'HTML'

效果图:

查询结果集转换成HTML存储过程的更多相关文章

  1. 使用SQL SERVER FOR XML PATH将多个结果集转换成一行并进行去重处理

    在一个医药行业的系统中需要根据患者的接触记录ID获取不同接触类型的集合,效果像这样     --患者接触记录信息,一个患者可以有N个不同的接触记录,每个接触记录又有N个接触类型记录 IF OBJECT ...

  2. hibernate查询部分字段转换成实体bean

    //hibernate查询部分字段转换成实体bean /** * 查询线路信息 */ @Override public List<Line> getSimpleLineListByTj(M ...

  3. mysql查询中字符串转换成数字

    在操作mysql时,经常需要将字符转换成数字,这一步虽然简单,但不常用的话也很容易忘记,现将在网上找到的方法记录如下: 1.将字符的数字转成数字,比如'0'转成0可以直接用加法来实现例如:将pony表 ...

  4. hibernate sql查询后对象转换成实体类

    在多表查询的时候使用hibernate的sql查询的时候,一般返回的是object[]数组,或者可以使用  session.createSQLQuery(sql).setResultTransform ...

  5. 在sql脚本中将查询结果集拼接成字符串

  6. ASP查询数据RS转换成COMMAND

    RS版本: IF(troubleCatalog="1" or troubleCatalog="2" or troubleCatalog="3" ...

  7. 使用HIBERNATE的SQL查询并将结果集自动转换成POJO

    在某些场合下,我们可能想使用HIBERNATE的框架提供的SQL查询接口,但是,由于实体没有做映射,HIBERNATE不能把结果集转换成你想要的List<POJO>,本文讨论如何在这种情况 ...

  8. 佩特来项目经验小集合(2)___组合查询存储过程,报错 &quot;varchar JBID=&#39;&#39; 转换成数据类型 int 时失败&quot;

       今天写一个组合查询的存储过程遇到这样一个问题:在将 varchar 值 'SELECT * FROM View_DLS_WXJD_Customer WHERE 1=1 and JBID ='' ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性 ...

随机推荐

  1. 数据库入门-pymysql模块的使用

    一.pymysql模块安装 由于本人的Python版本为python3.7,所以用pymysql来连接数据库(mysqldb不支持python3.x) 方法一: #在cmd输入 pip3 instal ...

  2. TP5多模块开发

    一般的thinkphp框架一般都是单模块开发的,但有时候我们可能需要进行多模块开发,例如添加个后台管理的模块.这次给人讲课,在Tp多模块开发的配置上翻车,感觉很有必要总结下,话不多说,直接上干货. 总 ...

  3. OpenStack--Rabbitmq组件消息队列

    概念 队列 MQ 全称为Message Queue,消息队列( MQ ) 是一种应用程序的通信方法.应用程序通过读写入列队的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们. 消息传递指的是 ...

  4. CentOS7.6最小化纯净版安装xfce桌面

    安装Xfce桌面环境 yum groupinstall "X Window system" yum install epel-release yum groupinstall xf ...

  5. ubuntu快速部署gitlab汉化容器

    前言:gitlab的原理我就不扯了(看这个https://www.jianshu.com/p/567207ac51cd),下面直接上操作 1.前提: a.要有docker的运行环境,用service ...

  6. HDU 1060  Leftmost Digit

    Leftmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  7. js拼音排序

    js拼音排序 var arr =['a','c','b','b']; arr.sort( function compareFunction(p1, p2) { return p1.localeComp ...

  8. CF809E Surprise me!

    题解: 一道很套路的题目 首先一个结论 $\phi(xy)=\frac{\phi(x)*\phi(y)*gcd(x,y)}{\phi(gcd(x,y))}$ 这个按照$\phi$的定义很容易知道 然后 ...

  9. 记忆(缓存)函数返回值:Python 实现

    对于经常调用的函数,特别是递归函数或计算密集的函数,记忆(缓存)返回值可以显着提高性能.而在 Python 里,可以使用字典来完成. 例子:斐波那契数列 下面这个计算斐波那契数列的函数 fib() 具 ...

  10. 使用python来操作redis用法详解

    1.redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRe ...