tengo un problema que me esta rompiendo la cabeza, espero puedan orientarme....
Bueno hasta hace poco estuve viendo la forma de enviar correos "masivos" y dentro del correo enviar datos en una tabla construida mediante sql... Y me salio tal y como esperaba todo genial !! PERO LO HICE EN UN AMBIENTE DE PRUEBA .. usando el AdventureWorks2008R2 ...
Desde ayer por la noche intente pasarlo a producción usando tablas de mi BD, sin embargo me eh topado con este problema... despues de analizar mucho ... llego a la conclusión que el problema esta en el procdimiento almacenado... veamos.
Procedmiento almacenado para el ambiente de pruebas, CORREO MASIVO
Código SQL:
Ver original
ALTER PROCEDURE [dbo].[GetMailsToBeSent] AS BEGIN DECLARE @contador INT SET @contador = 1 while @contador <= 10 BEGIN DECLARE @fecha DATE DECLARE @tableHTML NVARCHAR(MAX) ; SET @fecha=(SELECT CONVERT(VARCHAR(10),getDate(),120)) SET @tableHTML = N'<head>' + N'<style type="text/css">h2, body {font-family: Arial, verdana;} table{font-size:11px; border-collapse:collapse;} td{background-color:#F1F1F1; border:1px solid black; padding:3px;} th{background-color:#99CCFF;}</style>' + N'<h2><font color="#0000ff" size="4">Work Order Report ' + CONVERT(VARCHAR,@contador)+ '</font></h2>'+ N'</head>' + N'<body>' + N' <hr> ' + N' ' + 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 top 20 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 p.ProductID = 722 + @contador -- 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>' ; UPDATE MailsToBeSent SET body = @tableHTML, fecha = @fecha WHERE MailID = @contador SET @contador = @contador +1 END SELECT * FROM MailsToBeSent END
Como pueden darse cuenta aquí uso hasta while y me ejecuta genial!!
Procedimiento almacenado para la BD produccion:
Código SQL:
Ver original
ALTER PROCEDURE proc_enviarCorreo2 AS BEGIN DECLARE @fecha DATE DECLARE @tableHTML VARCHAR(4000) ; --set @fecha= (select CONVERT(VARCHAR(10), GETDATE(), 105)) SET @tableHTML = N'<head>' + N'<style type="text/css">h2, body {font-family: Arial, verdana;} table{font-size:11px; border-collapse:collapse;} td{background-color:#F1F1F1; border:1px solid black; padding:3px;} th{background-color:#99CCFF;}</style>' + N'<h2><font color="#0000ff" size="4">Work Order Report </font></h2>'+ N'</head>' + N'<body>' + N' <hr> ' + N' ' + N'<table border="1">' + N'<tr><th> ID</th><th> Fecha </th>' + N'<th>Nombre de Base </th><th> Nombre Del Backup </th><th> Tipo</th>' + N' </tr>' + CAST ( ( SELECT top 20 td = wo.id, '' -- td = CONVERT(VARCHAR(10), fecha, 105) , '', -- td = Base, '', -- td = nombre_bk, '', -- td = Tipo, '' FROM backups AS wo -- where CONVERT(VARCHAR(10), fecha, 105) = @fecha FOR XML PATH('tr'), TYPE ) AS NVARCHAR(MAX) ) + N'</table>' ; --print @tableHTML UPDATE EnviarCorreo SET body = @tableHTML SELECT * FROM EnviarCorreo END
Despues de quitarle un monton de cosas para llegar en "donde" es el cuello de botella...
y llego a la conclusion que el cuello de botella es en la construcción de la variable @tableHTML, apesar que le pongo q jale solo un campoo... hasta le puse un indice a ese campo .... cuando lo ejecuto desde el SSIS simplemente cae. pero cuando uso el otro procedimiento de la otra BD en el mismo SSIS .. ejecuta sin problemas.
mi duda es.... estas funcionas requieren de algun tipo de configuracion o algo?
estoy pensando que quizás si... no lo se..
Código SQL:
Ver original
FOR XML PATH('tr'), TYPE ) AS NVARCHAR(MAX) ) +
Alguna sugerencia, comentario u.u .. saludos,