sp_send_dbmail gespeicherte Prozedur mit Anhang senden

13

Ich wurde beauftragt, einem meiner Kunden einen kleinen monatlichen Bericht zu senden. Der Bericht wurde zuvor manuell auf der Instanz ausgeführt, die Ausgabe in eine Tabelle kopiert und als Anhang an den Kunden gesendet.

Ich suche nach einer dauerhafteren Lösung, daher beabsichtige ich sp_send_dbmail, die Abfrage mithilfe einer gespeicherten Prozedur auszuführen und als Anhang zu senden.

Alles funktioniert außer der Formatierung der Nachricht. Anfangs habe ich versucht, die Ausgabe als CSV-Datei mit einem anzuhängen, @query_result_seperator = ','aber die Ergebnisse waren überall!

Wenn ich den Bericht normal ausführe, sieht die Ausgabe in SQL gut aus. Das Senden als CSV oder nur im Nachrichtentext ist jedoch nicht möglich.

Ich denke, es könnte besser funktionieren, wenn ich die Ausgabe als HTML exportiere und als Anhang / oder als XML sende, aber ich weiß nicht, wie das geht.

Hat jemand irgendwelche Vorschläge?

Danke im Voraus!

Gareth
quelle

Antworten:

11

Wenn Sie die Datei noch exportieren und als Anhang senden müssen, kann dies auch in SQL Server vollständig automatisiert werden.

Der Export als CSV kann über BCP erfolgen . Diese Antwort enthält mehr Details , aber die Hauptidee ist:

bcp "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" queryout "D:\MyTable.csv" -c -t , -S SERVERNAME -T

Sie würden dann die Datei an die E-Mail anhängen sp_send_dbmail.

USE msdb;
GO

EXEC sp_send_dbmail 
  @recipients='[email protected]',
  @subject='Client Report',
  @body='Please find your latest report attached',
  @file_attachments='D:\MyTable.csv';

Wenn Sie möchten, können Sie mehrere Dateien an eine E-Mail anhängen .

Mark Sinkinson
quelle
8

Ja, Sie können den Bericht im HTML-Format senden, z. B. wie in MS aufgeführt:

Szenario: In diesem Beispiel wird eine E-Mail-Nachricht an Dan Wilson mit der E-Mail-Adresse [email protected] gesendet. Die Nachricht hat den Betreff Arbeitsauftragsliste und enthält ein HTML-Dokument, in dem die Arbeitsaufträge mit einem Fälligkeitsdatum von weniger als zwei Tagen nach dem 30. April 2004 aufgeführt sind. Database Mail sendet die Nachricht im HTML-Format.

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 AdventureWorks2008R2.Production.WorkOrder as wo
              JOIN AdventureWorks2008R2.Production.Product AS p
              ON wo.ProductID = p.ProductID
              WHERE DueDate > '2006-04-30'
                AND DATEDIFF(dd, '2006-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' ;

Darüber hinaus können Sie in SQL Server mithilfe der SSIS-Skriptaufgabe die Funktion zum Senden von HTML-formatierten E-Mails verwenden

Wenn Sie einen HTML-Bericht planen möchten, lesen Sie diesen hier

KASQLDBA
quelle