You are on page 1of 6

Email con consultas anexas II desde SQL Server 2000

Domingo 22 de Julio de 2007

Por Rony Olazbal Ramirez


El siguiente artculo viene como una continuacin de mi primer manuscrito Email con consultas anexas desde SQL Server 2000 , pblicado en WWW.PORTALSQL.COM en 2004. El siguiente procedimiento que os mostrar es otra manera de enviar email desde SQL Server 2000, independientemente del cliente y servidor de correo utilizado; as mismo se usar el comando bcp de SQL para generar archivos de texto y un truco para agregar los encabezados de las columnas ya que el bcp no lo hace. Estuve recibiendo consultas de muchos lectores sobre que hacer en caso de no tener Exchange Server, Outlook, Windows Server 2003, instalados y evitar el conocido error cuando se trata de configurar el componente MAPI de SQL Server con otros gestores de correo. Este error se muestra al intentar configurar Kerio Mail Server para envi de correo desde SQL Server Enterprise Manager utilizando el procedimiento estandar que conocimos en la parte I de este artculo:

Sin embargo tenemos una solucin ideal que rompe este esquema.

En el siguiente link HTTP://WWW.SQLDEV.NET/XP/XPSMTP.HTM encontraran informacin acerca de como instalar el componente xpsmtp basado en SMTP para envi de correo desde SQL Server y podrn adems descargar las dll correspondientes. El siguiente ejemplo lo realic con los siguientes software: 1. Microsoft Windows XP sp2 2. Microsoft SQL Server 2000 sp4 3. Kerio Mail Server 6.4 (descargado desde WWW.KERIO.COM ) 4. Microsoft Outlook 2003 (se puede utilizar cualquier otro cliente POP3) En la prctica este proceso lo realice para notificar al coordinador de una gran compaa de alimentos de que tiene pedidos pendientes por aprobar. Bsicamente toda la lgica reside en un store procedure el cual es ejecutado por una tarea programada en forma diaria. La actual versin de la dll xpsmtp no provee envio de querys adjuntos, sin embargo esto no es inpedimento para recurrir a la imaginacin y utilizar el comando bcp para generar un archivo de texto plano con los datos a adjuntar, el detalle esta en que el bcp no tiene forma de crear los encabezados de las columnas siendo materia de consulta en muchos de los foros de internet sin ninguna solucin optima. En esta oportunidad les brindar una manera sencilla y fcil de poder incluir los encabezados.

Esto es mas fcil de interpretar para el usuario que el resultado anterior emitido por el bcp

Para este ejemplo utilizaremos la Base de Datos Northwind y crearemos previamente una carpeta temporal c:\tempsql donde se guardar el archivo de texto generado por el bcp el cual a su vez sera el attachment usado por el procedimiento xp_smtp_sendmail. Asumiremos que todos los pedidos estan pendientes. El cdigo transact sql es el siguiente: / ******************************************************************* ********************* Procedure : spp_pedpendientes Description: Lista los pedidos pendientes y Envia email al responsable de autorizar los pedidos Author Date : Rony Olazbal : 22/07/2007

******************************************************************* **********************/ declare @archivo_txt varchar(100) declare @administrador_SQL varchar(50) declare @password_sql varchar(50) declare @base_datos varchar(50)

--- configurar estos datos de acuerdo al servidor

set @archivo_txt='c:\tempsql\pedidos_pendientes.txt' set @administrador_SQL='sa' set @password_sql='sa' set @base_datos='Northwind'

--- Este es un truco para obtener el query con encabezado en formato de texto plano para ser usado por el bcp declare @query varchar(600) set @query='select ''OrderID CustomerID '' as linea '+ 'union all '+ 'select ''==================================================== ========================='' as linea '+ 'union all '+ 'select convert(char(10),p.orderid) + space(1)+ p.customerid + space(1) + convert(char(30),c.companyname) + space(1) + convert(varchar(10),p.orderdate,103) as linea '+ 'from '+ @base_datos + '.dbo.orders p left join '+ @base_datos + '.dbo.customers c on p.customerid=c.customerid ' Companyname OrderDate

--- obtiene el nmero de registros procesados exec (@query) declare @registros int set @registros = @@rowcount

--- Comando bcp para generar el archivo de texto plano. DECLARE @chr_BCP_ARCHIVO VARCHAR(4000)

SELECT @chr_BCP_ARCHIVO = 'bcp "' + @query + '" queryout '+ @archivo_txt + ' -c -U '+ @administrador_SQL + ' -P '+ @password_sql EXEC master..xp_cmdshell @chr_BCP_ARCHIVO if @registros > 0 -------------------------------------------------------- envia email SMTP -----------------------------------------------------Begin declare @mensaje varchar(250) declare @rc int set @mensaje='Estimado Sr.(a)'+ char(13)+char(13)+'Usted tiene ' + ltrim(str(@registros)) + ' pedidos pendientes por aprobar.' exec @rc = master.dbo.xp_smtp_sendmail @FROM = 'admin@orion.com',

@FROM_NAME = 'Administrador', @TO @priority @subject @message @type = 'ronyol@orion.com', = 'HIGH', = 'Pedidos pendientes por aprobar', = @mensaje, = 'text/plain',

@attachments= 'c:\tempsql\pedidos_pendientes.txt', @server = 'orion'

select RC = @rc -- devuelve 0 = OK end

Finalmente ejecutamos el cdigo anterior desde un store procedure o una tarea programada y se enviar un correo notificando los pedidos pendientes de aprobacin.

Rony Olazbal Ramirez (NETRONY@HOTMAIL.COM ), Caracas, Venezuela, es MCDBA en SQL Server 2000/2005, MCAD, MCSD, MCT. Dedicado al desarrollo de sistemas desde el ao 1987; 5ta. Estrella en DCE , especialista en tecnologas .NET, VB .Net, C# , ASP .Net y Web Services XML.

Espero que os guste y les sea de mucha utilidad.

You might also like