sp_send_dbmail procédure stockée envoyer avec pièce jointe

13

J'ai été chargé d'envoyer un petit rapport mensuel à l'un de mes clients. Le rapport a été précédemment exécuté manuellement sur l'instance, la sortie copiée dans une feuille de calcul et envoyée au client en tant que pièce jointe.

Je recherche une solution plus permanente, j'ai donc l'intention d'utiliser une sp_send_dbmailprocédure stockée pour exécuter la requête et l'envoyer en pièce jointe.

Tout fonctionne sauf la mise en forme du message. Au départ, j'ai essayé de joindre la sortie sous forme de fichier CSV avec un @query_result_seperator = ','mais les résultats étaient partout!

Lorsque j'exécute le rapport normalement, la sortie semble correcte en SQL. Mais l'envoyer au format CSV ou simplement dans le corps du message ne le fait pas.

Je pense que cela pourrait mieux fonctionner si j'exporte la sortie au format HTML et l'envoie en tant que pièce jointe / ou XML, mais je ne sais pas comment faire.

Est-ce que quelqu'un a des suggestions?

Merci d'avance!

Gareth
la source

Réponses:

11

Si vous devez toujours exporter le fichier et l'envoyer en tant que pièce jointe, cela peut également être entièrement automatisé dans SQL Server.

L'exportation au format CSV peut être réalisée via BCP . Il y a plus de détails dans cette réponse , mais l'idée principale est:

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

Vous devez ensuite joindre le fichier à l'e-mail 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';

Vous pouvez, si vous le souhaitez, joindre plusieurs fichiers à un seul e-mail .

Mark Sinkinson
la source
8

Oui, vous pouvez envoyer le rapport au format HTML, par exemple comme indiqué dans MS:

Scénario: Cet exemple envoie un message électronique à Dan Wilson à l'aide de l'adresse électronique [email protected]. Le message a le sujet Liste des bons de travail et contient un document HTML qui montre les bons de travail avec une date d'échéance moins de deux jours après le 30 avril 2004. La messagerie de base de données envoie le message au format HTML.

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

De plus, vous pouvez utiliser la lecture Envoyer des e-mails au format HTML dans SQL Server à l'aide de la tâche de script SSIS

Aussi, si vous souhaitez planifier un rapport HTML, lisez ceci ici

KASQLDBA
la source