2017-05-22 1 views
1

Ich verwende die gespeicherte Prozedur msdb.dbo.sp_send_dbmail, um eine HTML-E-Mail mit einer abgefragten Tabelle in den Text zu senden. Ich habe das folgende Codebeispiel aus Microsoft's MSDN meiner E-Mail erstellen gespeicherte Prozedur zu senden:sp_send_dbmail sendet eine leere E-Mail, wenn die abgefragte Tabelle leer ist

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' ; 

Der Code funktioniert und sieht perfekt aus, wenn Daten ist von meiner Abfrage zurückgegeben werden. Wenn jedoch null Zeilen zurückgegeben werden, wird meine E-Mail mit einem vollständig leeren Textkörper (HTML vor und nach der Tabelle wird nicht angezeigt) gesendet. Gibt es eine Möglichkeit, die E-Mail korrekt zu senden, wenn in meiner SQL-Abfrage keine Daten vorhanden sind?

Antwort

1

Es ist leer, weil es eine NULL/leere Menge verkettet. I.e. select 'this' + null Sie sollten jedoch in der Lage sein, das mit ISNULL zu umbrechen und eine Leerstelle zu erzwingen.

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' ; 
Verwandte Themen