procedimento armazenado sp_send_dbmail enviar com anexo

13

Fui encarregado de enviar um pequeno relatório mensal para um dos meus clientes. O relatório já havia sido executado manualmente na instância, a saída copiada para uma planilha e enviada ao cliente como um anexo.

Estou procurando uma solução mais permanente, por isso pretendo usar o sp_send_dbmailprocedimento armazenado para executar a consulta e enviá-la como um anexo.

Tudo funciona, exceto a formatação da mensagem. Inicialmente, tentei anexar a saída como um arquivo CSV com um @query_result_seperator = ','mas os resultados estavam em toda parte!

Quando executo o relatório normalmente, a saída fica bem no SQL. Mas enviá-lo como um CSV ou apenas no corpo da mensagem não.

Eu acho que poderia funcionar melhor se eu exportar a saída como HTML e enviá-la como um anexo / ou como XML, mas não sei como fazer isso.

Alguém tem alguma sugestão?

Desde já, obrigado!

Gareth
fonte

Respostas:

11

Se você ainda precisar exportar o arquivo e enviá-lo como um anexo, isso também poderá ser totalmente automatizado no SQL Server.

A exportação como um CSV pode ser obtida via BCP . Há mais detalhes nesta resposta , mas a idéia principal é:

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

Você anexaria o arquivo ao email em 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';

Você pode, se desejar, anexar vários arquivos a um email .

Mark Sinkinson
fonte
8

Sim, você pode enviar o relatório via formato HTML, por exemplo, conforme listado no MS:

Cenário: Este exemplo envia uma mensagem de email para Dan Wilson usando o endereço de email [email protected]. A mensagem tem o assunto Lista de Ordens de Serviço e contém um documento HTML que mostra as ordens de serviço com um DueDate menos de dois dias após 30 de abril de 2004. O Database Mail envia a mensagem no formato 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' ;

Além disso, você pode usar o envio de email formatado em HTML para leitura no SQL Server usando a tarefa de script SSIS

Além disso, se você deseja agendar um relatório HTML, leia-o aqui

KASQLDBA
fonte