【问题标题】:SQL Job outputting as HTML Table instead of textSQL 作业输出为 HTML 表而不是文本
【发布时间】:2014-04-03 14:09:23
【问题描述】:

好的,所以我有一个作业,其中包含 4 个单独的选择查询。

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'Database Email',
    @recipients = 'dbcheck@xxx.com',
    @subject = 'SQL Replication Deletion Check',
    @query = ''SELECT '\\server1\folder1\SQL\check.sql''
SELECT '' ''
SELECT ''1''
SELECT * FROM [repserv].[dbo].[1repdupecheck]
SELECT '' ''
SELECT ''2''
SELECT * FROM [repserv].[dbo].[2repdupecheck]
SELECT '' ''
SELECT ''3''
SELECT * FROM [repserv].[dbo].[3repdupecheck]
SELECT '' ''
SELECT ''4''
SELECT * FROM [repserv].[dbo].[4repdupecheck]',
    @attach_query_result_as_file = 0,
    @query_result_no_padding = 1,
    @query_result_header = 0;

目前它输出为文本非常好。

\\server1\folder1\SQL\check.sql

1
1820 '45074',
1854 '45074',
1822 '45488',

2
1819 '45074',
1853 '45074',
1851 '45488',

3
1871 '43971',
1873 '43971',
1875 '44429',

4
1842 '42729',
1857 '42729',
1870 '43971',

但是我希望它是表格格式,这样我就可以轻松地一次突出显示一列数据。

我知道这可以用 HTML 来完成,这是唯一可行的方法吗?如果可以,我将如何去做?

【问题讨论】:

    标签: html sql output sql-job


    【解决方案1】:

    我通常这样做的方式是将这些结果放入@body 参数,而不是@query 参数。也就是说,我首先获取所有结果并对其进行格式化,然后简单地将其传递给过程,而不是在过程调用时即时执行。

    这可能看起来像这样:

    DECLARE @EmailBody NVARCHAR(MAX) = 'Some Text Here <table><thead><tr><th>SomeHeaderOne</th><th>SomeHeaderTwo</th></tr></thead><tbody>##TableBody##</tbody>'
    DECLARE @EmailTableContent NVARCHAR(MAX)
    
    SELECT @EmailTableContent = COALESCE(@EmailTableContent + '', '')
                            + '<tr>'
                            + '<td style="border-bottom: solid 1px #ddd; padding: 20px;">' + ColumnOne + '</td>'
                            + '<td style="border-bottom: solid 1px #ddd; padding: 20px; text-align: center;">' + ColumnTwo + '</td>'
                            + '</tr>'
    FROM TheTable
    WHERE ColumnOne = 'Something'
    
    SELECT @EmailBody = REPLACE(@EmailBody, '##TableBody##', @EmailTableContent)
    
    EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'Database Email',
    @recipients = 'dbcheck@xxx.com',
    @subject = 'SQL Replication Deletion Check',
    @body = @EmailBody,
    

    【讨论】:

    • 试图用上面的代码来做这件事,但根本不能让它工作,不太清楚什么去哪里等等
    • 好吧,你有@EmailBody,它定义了电子邮件和表格的结构。然后,@EmailTableContent 为每一行生成一个 HTML 字符串,它是一个 &lt;tr&gt;,您可以在其中更改 ColumnOneColumnTwo;你会将FROM TheTable 更改为FROM [repserv].[dbo].[1repdupecheck]。您将不得不这样做四次,因为您需要四个不同的表,可能有四个不同的变量。然后,将生成的 HTML 注入@EmailBody,并执行如图所示的过程。
    猜你喜欢
    • 1970-01-01
    • 2013-06-21
    • 2016-06-29
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多