工作中经常需要用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. SpringJUnit4ClassRunner (单元测试)

    1.在Maven的pom.xml中加入 <dependency> <groupId>junit</groupId> <artifactId>junit& ...

  2. Qt-c++桌面编程报错:qt.qpa.plugin: Could not find the Qt platform plugin "windows" in "",已解决

    语言:c++ 编译库:Qt GUI,qt5.12.1 软件类型:Qt application,qt桌面软件 运行平台:window 10 ?按照[https://www.devbean.net/201 ...

  3. 单机MongoD搭建

    MongoD 安装 1 .下载地址: wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.8.tgz 2 .添加 ...

  4. 前端校验插件——Validator简单使用

    >>>>>>>>>>>>>>>>>>>>>>>>> ...

  5. Esptouch移植xamarin记要

    目标: 1.支持最新esptouch库更新 2.android和IOS双端混合UI开发App 解决思路: 到esptouch官方开源项目库(android,ios)编译jar及ios标准库到xamar ...

  6. MyIbatis和Hibernate的区别--2019-04-26

    1.MyBatis 真正实现了java代码和sql的分离 2.Hibernate 是全自动的,MyBatis是半自动的 Hibernate实现了部分自动生成SQL 3.SQL优化上 MyBatis 强 ...

  7. java位移运算符2 转

    https://blog.csdn.net/xxx134617/article/details/7454774 java中int类型占4个字节,二进制用补码表示: 3的二进制表示: 00000000 ...

  8. VScode加文件头的方式

    在VScode中添加文件头,设置文件编辑者的方式,在软件中查询到file-header插件: 安装好,此时通过是可以生成默认的文件头.如果需要修改配置,在文件=>首选项=>设置中修改: 查 ...

  9. mysql 8.0 密码加密方式的坑

    问题:新安装好MySQL 8.0和Navicat之后,连接时总是报: 1251 Client does not support authentication protocol requested by ...

  10. MYSQL可调用执行自定义SQL的代码

    DELIMITER $$ USE `mysql_wispeed01`$$ DROP PROCEDURE IF EXISTS `sp_execSQL`$$ CREATE DEFINER=`sa`@`%` ...