Está en la página 1de 6

ENVIAR CORREO ELECTRONICO EN FORMATO

TABULAR UTILIZANDO EL CORREO DE LA BASE DE


DATOS SQL SERVER

Problema

Algunas veces nos encontramos que en algunas tablas de SQL contienen datos
resumidos (resumidos semanalmente / mensualmente / trimestralmente).
Anteriormente, esos datos se podían enviar por correo electrónico como un
archivo adjunto sin formato a los destinatarios. Se necesita convertir esto de tal
manera que el propio correo electrónico contenga los datos de la tabla. De esta
manera, los destinatarios podrían ver los datos en formato tabular, lo que facilitaría
la legibilidad. Por lo tanto, se llega a la pregunta de cómo enviar correos
electrónicos desde SQL Server con datos en formato tabular.

Solucion

Primero vamos a entender el código utilizado en este manual.

Primero se va a crear una tabla temporal y completarla con algunos datos de


muestra, es una lista de los mejores jugadores de tenis junto con su rango,
nombre, puntos de clasificación y país. Esta tabla temporal se usa solo en el
ejemplo, en tiempo real la tabla temporal no sería necesaria, en su lugar, se usaría
la tabla de la base de datos real que contiene los datos.

La siguiente sección es responsable de convertir los datos de la tabla de SQL


Server que creamos en una variable local “@xml”. En la declaración de selección,
cada una de las columnas se mostrará como datos de tabla y filas en el correo
electrónico.

En otra variable local “#@body” agregamos las etiquetas HTML requeridas y el


texto que se muestra en el correo electrónico, en este caso “Información de
clasificación de tenis”. Luego se incluye los encabezados de columna de la tabla
dentro del correo electrónico. Recuerde que estos encabezados de tabla (nombres
de columna) se pueden cambiar según su conveniencia. En el código de ejemplo,
los nombres de columna de la tabla temporal se han utilizado como encabezados
de tabla. Si desea mostrar “Jugador” en lugar de “Nombre del Jugador”, puede
hacerlo cambiando la etiqueta del encabezado de la tabla a <th>Jugador</th>.
Finalmente se agregan las etiquetas HTML de cierre.

Una vez que se ha formateado el HTML, envío el correo electrónico utilizando el


procedimiento almacenado del sistema sp_send_dbmail que se encuentra en la
base de datos msdb y finalmente se borra la tabla temporal.

Para usar el codigo siguiente, contra la tabla de la base de datos, se tendra que
reemplazar el nombre de la tabla y los nombres de las columnas de la tabla
siempre que sea necesario. Además, se deberá cambiar el nombre del perfil de
correo y la dirección de correo electrónico que se desea utilizar.

Ejemplo 1. Enviar tabla HTML a través del correo de Base de


Datos SQL Server

Acá está el codigo de Ejemplo.

CREATE TABLE #Temp


(
[Rank] [int],
[Player Name] [varchar](128),
[Ranking Points] [int],
[Country] [varchar](128)
)

INSERT INTO #Temp


SELECT 1,'Rafael Nadal',12390,'Spain'
UNION ALL
SELECT 2,'Roger Federer',7965,'Switzerland'
UNION ALL
SELECT 3,'Novak Djokovic',7880,'Serbia'

DECLARE @xml NVARCHAR(MAX)


DECLARE @body NVARCHAR(MAX)

SET @xml = CAST(( SELECT [Rank] AS 'td','',[Player Name] AS 'td','', [Ranking


Points] AS 'td','', Country AS 'td'
FROM #Temp
ORDER BY Rank
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))

SET @body ='<html><body><H3>Tennis Rankings Info</H3>


<table border = 1>
<tr>
<th> Rank </th> <th> Player Name </th> <th> Ranking Points </th> <th> Country
</th></tr>'

SET @body = @body + @xml +'</table></body></html>'

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'SQL ALERTING', -- replace with your SQL Database Mail Profile
@body = @body,
@body_format ='HTML',
@recipients = 'daossa@hptu.org.co', -- replace with your email address
@subject = 'E-mail in Tabular Format' ;

DROP TABLE #Temp

La salida HTML del ejemplo anterior se ve así:


Y así es como se vería el correo electrónico:
Ejemplo 2. Enviar tabla HTML a través del correo de Base de
Datos SQL Server

Como otro ejemplo, si desea cambiar esto y seleccionar FirstName, LastName y


EmailAddress de Person.Contact en la base de datos AdventureWorks y ordenarlo
por LastName, FirstName, se harian los siguientes cambios:

DECLARE @xml NVARCHAR(MAX)


DECLARE @body NVARCHAR(MAX)

SET @xml = CAST(( SELECT [FirstName] AS 'td','',[LastName] AS 'td','',


[EmailPromotion] AS 'td'
FROM Person.Person
ORDER BY LastName, FirstName
FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))

SET @body ='<html><body><H3>Contact Info</H3>


<table border = 1>
<tr>
<th> First Name </th> <th> Last Name </th> <th> Email </th></tr>'

SET @body = @body + @xml +'</table></body></html>'

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'SQL ALERTING', -- replace with your SQL Database Mail Profile
@body = @body,
@body_format ='HTML',
@recipients = 'daossa@hptu.org.co', -- replace with your email address
@subject = 'E-mail in Tabular Format' ;

También podría gustarte