web-dev-qa-db-fra.com

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

J'ai été chargé d'envoyer un petit rapport mensuel à l'un de mes clients. Le rapport a précédemment été 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 sp_send_dbmail procédure stockée pour exécuter la requête et l'envoyer en tant que pièce jointe.

Tout fonctionne sauf la mise en forme du message. Au départ, j'ai essayé de joindre la sortie en tant que 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!

13
Gareth

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 dans 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 .

11
Mark Sinkinson

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 Envoi d'e-mails au format HTML dans SQL Server à l'aide de la tâche de script SSIS

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

8
KASQLDBA