sp_send_dbmail procedimiento almacenado enviar con archivo adjunto


13

Me encargaron enviar un pequeño informe mensual a uno de mis clientes. El informe se ejecutó previamente manualmente en la instancia, la salida se copió en una hoja de cálculo y se envió al cliente como un archivo adjunto.

Estoy buscando una solución más permanente, por lo que tengo la intención de utilizar el sp_send_dbmailprocedimiento almacenado para ejecutar la consulta y enviarla como un archivo adjunto.

Todo funciona excepto el formato del mensaje. Inicialmente intenté adjuntar la salida como un archivo CSV con un @query_result_seperator = ','pero los resultados estaban en todas partes!

Cuando ejecuto el informe normalmente, el resultado se ve bien en SQL. Pero enviarlo como CSV o simplemente en el cuerpo del mensaje no lo hace.

Creo que podría funcionar mejor si exporto el resultado como HTML y lo envío como un archivo adjunto / o como XML, pero no sé cómo hacerlo.

¿Alguien tiene alguna sugerencia?

¡Gracias por adelantado!

Respuestas:


11

Si aún necesita exportar el archivo y enviarlo como un archivo adjunto, esto también se puede automatizar completamente en SQL Server.

La exportación como CSV se puede lograr a través de BCP . Hay más detalles en esta respuesta , pero la idea principal es:

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

Luego adjuntaría el archivo al correo electrónico sp_send_dbmail.

USE msdb;
GO

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

Si lo desea, puede adjuntar varios archivos a un correo electrónico .


8

Sí, puede enviar el informe en formato HTML, por ejemplo, tal como se indica en MS:

Escenario: este ejemplo envía un mensaje de correo electrónico a Dan Wilson utilizando la dirección de correo electrónico danw@Adventure-Works.com. El mensaje tiene el asunto Lista de órdenes de trabajo y contiene un documento HTML que muestra las órdenes de trabajo con una fecha de vencimiento inferior a dos días después del 30 de abril de 2004. El Correo electrónico de base de datos envía el mensaje en 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='danw@Adventure-Works.com',
    @subject = 'Work Order List',
    @body = @tableHTML,
    @body_format = 'HTML' ;

Además, puede usar el correo electrónico con formato HTML de envío de lectura en SQL Server utilizando la tarea de secuencia de comandos SSIS

Además, si desea programar un informe HTML, lea esto aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.