web-dev-qa-db-ja.com

sp_send_dbmailストアドプロシージャの添付ファイル付き送信

私は、私の顧客の1人に小さな月次レポートを送信することを任されています。レポートは以前にインスタンスで手動で実行され、出力はスプレッドシートにコピーされ、添付ファイルとして顧客に送信されました。

より永続的な解決策を探しているので、sp_send_dbmailストアドプロシージャを使用してクエリを実行し、添付ファイルとして送信するつもりです。

メッセージのフォーマット以外はすべて機能します。最初は@query_result_seperator = ','を含むCSVファイルとして出力を添付しようとしましたが、結果はどこにでもありました!

レポートを通常どおり実行すると、出力はSQLで正常に表示されます。ただし、CSVとして、またはメッセージ本文でのみ送信することはできません。

出力をHTMLとしてエクスポートし、それを添付ファイルとして、またはXMLとして送信すると、うまくいくと思いますが、その方法がわかりません。

誰か提案はありますか?

前もって感謝します!

13
Gareth

それでもファイルをエクスポートして添付ファイルとして送信する必要がある場合は、SQL Serverで完全に自動化することもできます。

CSVとしてのエクスポートは [〜#〜] bcp [〜#〜] で実行できます。詳細は this answer にありますが、主な考え方は次のとおりです。

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

次に、そのファイルを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';

必要に応じて、 1つのメールに複数のファイルを添付 することができます。

11
Mark Sinkinson

はい。たとえば、MSにリストされているHTML形式でレポートを送信できます。

シナリオ:この例では、電子メールアドレス[email protected]を使用して、電子メールメッセージをDan Wilsonに送信します。メッセージには件名の作業指示書リストがあり、DueDateが2004年4月30日から2日未満の作業指示書を示すHTMLドキュメントが含まれています。データベースメールはメッセージを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' ;

さらに、read SQL ServerでSSISスクリプトタスクを使用してHTML形式の電子メールを送信する を使用できます。

また、HTMLレポートのスケジュールを設定する場合は、こちらをご覧ください ここ

8
KASQLDBA