2017-05-22 204 views
1

我正在使用存储过程msdb.dbo.sp_send_dbmail向查看的表格内容发送HTML电子邮件。我用下面的代码示例从Microsoft's MSDN创建我的电子邮件发送的存储过程:当查询表为空时,sp_send_dbmail发送空白邮件

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='[email protected]', 
    @subject = 'Work Order List', 
    @body = @tableHTML, 
    @body_format = 'HTML' ; 

代码工作,并期待完美的,当有来自我的查询返回的数据。但是,如果返回行,则我的电子邮件将以完全空白的正文(表格未显示之前和之后的任何HTML)发送。当我的SQL查询中没有数据时,有什么办法可以正确发送电子邮件吗?

回答

1

这是空白,因为它连接了NULL /空集。即select 'this' + null你应该可以用ISNULL来包装它,并强制一个空格。

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>' + 
    ISNULL(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='[email protected]', 
    @subject = 'Work Order List', 
    @body = @tableHTML, 
    @body_format = 'HTML' ;