html - sp_send_dbmail - 将表中的行格式化为红色以发出警报

标签 html t-sql sql-server-2008-r2 sp-send-dbmail

我在此 MSDN 页面上使用类似于示例 C 的内容: http://msdn.microsoft.com/en-us/library/ms190307.aspx

DECLARE @tableHTML  NVARCHAR(MAX) ;

SET @tableHTML =
    N'<H1>Work Order Report</H1>' +
    N'<table border="1">' +
    N'<tr><th>Work Order ID</th><th>Product ID</th>' +
    N'<th>Name</th><th>Order Qty</th><th>Due Date</th>' +
    N'<th>Expected Revenue</th></tr>' +
    CAST ( ( SELECT td = wo.WorkOrderID,       '',
                    td = p.ProductID, '',
                    td = p.Name, '',
                    td = wo.OrderQty, '',
                    td = wo.DueDate, '',
                    td = (p.ListPrice - p.StandardCost) * wo.OrderQty
              FROM AdventureWorks.Production.WorkOrder as wo
              JOIN AdventureWorks.Production.Product AS p
              ON wo.ProductID = p.ProductID
              WHERE DueDate > '2004-04-30'
                AND DATEDIFF(dd, '2004-04-30', DueDate) < 2 
              ORDER BY DueDate ASC,
                       (p.ListPrice - p.StandardCost) * wo.OrderQty DESC
              FOR XML PATH('tr'), TYPE 
    ) AS NVARCHAR(MAX) ) +
    N'</table>' ;

EXEC msdb.dbo.sp_send_dbmail @recipients='<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7b1f1a150c3b3a1f0d1e150f0e091e562c1409100855181416" rel="noreferrer noopener nofollow">[email protected]</a>',
    @subject = 'Work Order List',
    @body = @tableHTML,
    @body_format = 'HTML' ;

我有一个名为“评级”的列,根据我自己的逻辑将其设置为“好”或“差”。 我想让所有评级为“差”的行都有红色背景。我知道如何在 HTML 中执行此操作,但不确定如何使用本示例中演示的“FOR XML”查询执行此操作。看来我必须向某些 TD 语句添加属性,而不是向其他语句添加属性。

最佳答案

您不能直接执行此操作。需要一点“手工制作”的 HTML。这是一种可以使用的方法。

在单独的 CTE 中选择好记录和坏记录并附加“td”标签。对于不好的,还附加样式信息。

然后附加“tr”标签并组合(UNION)数据行并使用 xmlpath 连接它们。

为了简单起见,我删除了按列排序,但您可以在 CTE 中选择它们并稍后对结果进行排序。

注意:我已经测试了输出 HTML,它可以工作,但我不是 HTML 专家,所以不要介意 HTML 标记中是否有任何错误。请随意更正它。

DECLARE @tableHTML  NVARCHAR(MAX) 
,@Data NVARCHAR (MAX)=''
SET @tableHTML =
N'<H1>Work Order Report</H1>' +
N'<table border="1">' +
N'<tr><th>Work Order ID</th><th>Product ID</th>' +
N'<th>Name</th><th>Order Qty</th><th>Due Date</th>' +
N'<th>Expected Revenue</th></tr>' 

 ;WITH CTE_Good AS
 (
 SELECT          HTMLRowData=    N'<td>'+STR(wo.WorkOrderID)+N'</td>'
                        +N'<td>'+STR(p.ProductID)+N'</td>' 
                        +N'<td>'+p.Name+N'</td>' 
                        +N'<td>'+STR(wo.OrderQty)+N'</td>' 
                        +N'<td>'+CONVERT(VARCHAR(10),wo.DueDate,101)+N'</td>' 
                        +N'<td>'+STR((p.ListPrice - p.StandardCost) * wo.OrderQty)+N'</td>' 
      FROM AdventureWorks.Production.WorkOrder as wo
      JOIN AdventureWorks.Production.Product AS p
      ON wo.ProductID = p.ProductID
      WHERE DueDate > '2004-04-30'
        AND DATEDIFF(dd, '2004-04-30', DueDate) < 2
        --AND Rating = 'Good'
  )
,CTE_Bad AS 
  (
   SELECT        HTMLRowData=    N'<td><p style="color:red">'+STR(wo.WorkOrderID)+N'</p></td>'
                        +N'<td><p style="color:red">'+STR(p.ProductID)+N'</p></td>' 
                        +N'<td><p style="color:red">'+p.Name+N'</p></td>' 
                        +N'<td><p style="color:red">'+STR(wo.OrderQty)+N'</p></td>'
                        +N'<td><p style="color:red">'+CONVERT(VARCHAR(10),wo.DueDate,101)+N'</p></td>' 
                        +N'<td><p style="color:red">'+STR((p.ListPrice - p.StandardCost) * wo.OrderQty)+N'</p></td>'
      FROM AdventureWorks.Production.WorkOrder as wo
      JOIN AdventureWorks.Production.Product AS p
      ON wo.ProductID = p.ProductID
      WHERE DueDate > '2004-04-30'
      AND DATEDIFF(dd, '2004-04-30', DueDate) < 2
      --AND Rating = 'Bad'

  )

SELECT @Data=(SELECT  HTMLRows 
              FROM    (
        SELECT N'<tr>'+HTMLRowData+N'</tr>' AS HTMLRows FROM CTE_Good
        UNION  SELECT N'<tr>'+HTMLRowData+N'</tr>' AS HTMLRows FROM CTE_Bad 
       ) mi            
     FOR XML PATH(''), TYPE
       ).value('/', 'NVARCHAR(MAX)')

  SET @tableHTML=@tableHTML+@Data+N'</table>'

--SELECT @tableHTML

EXEC msdb.dbo.sp_send_dbmail @recipients='<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0763666970474663716269737275622a5068756c742964686a" rel="noreferrer noopener nofollow">[email protected]</a>',
@subject = 'Work Order List',
@body = @tableHTML,
@body_format = 'HTML' ;

关于html - sp_send_dbmail - 将表中的行格式化为红色以发出警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12161771/

相关文章:

html - 将 div 内的 div 推到与 IE7 一起使用的最底部

javascript - 带样式显示的div :table has wrong height

html - CSS3 降雪动画禁用内部链接

SQL Server 2012 - 根据另一列的值重置运行总计

sql - 从表中选择几个 max()

php - 如何在没有 Flash/Adobe 的情况下在 PHP 网站上显示 PDF

SQL Server XQuery 修改

sql - 合并 T-SQL 中的连续行组并对每组中的值求和

sql-server - 交叉连接时出错

sql - 异常的sql server查询结果