Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/03/2015, 14:52
jmendezg
 
Fecha de Ingreso: febrero-2015
Mensajes: 89
Antigüedad: 9 años, 3 meses
Puntos: 1
Problemas con un Procedimiento Almac..

Que tal,

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
  1. ALTER PROCEDURE [dbo].[GetMailsToBeSent]
  2. AS
  3. BEGIN
  4. DECLARE @contador INT
  5. SET @contador = 1
  6. while @contador  <= 10
  7. BEGIN
  8. DECLARE @fecha DATE
  9. DECLARE @tableHTML  NVARCHAR(MAX) ;
  10. SET @fecha=(SELECT CONVERT(VARCHAR(10),getDate(),120))
  11. SET @tableHTML  =
  12.    N'<head>' +
  13. 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>' +
  14.    N'<h2><font color="#0000ff" size="4">Work Order Report  ' + CONVERT(VARCHAR,@contador)+ '</font></h2>'+
  15.    N'</head>' +
  16. N'<body>' +
  17. N' <hr> ' +
  18. N' ' +
  19.     N'<table border="1">' +
  20.     N'<tr><th>Work Order ID</th><th>Product ID</th>' +
  21.     N'<th>Name</th><th>Order Qty</th><th>Due Date</th>' +
  22.     N'<th>Expected Revenue</th>
  23.    </tr>' +
  24.     CAST ( ( SELECT top 20  td = wo.WorkOrderID,       '',
  25.                     td = p.ProductID, '',
  26.                     td = p.Name, '',
  27.                     td = wo.OrderQty, '',
  28.                     td = wo.DueDate, '',
  29.                     td = (p.ListPrice - p.StandardCost) * wo.OrderQty
  30.               FROM AdventureWorks2008R2.Production.WorkOrder AS wo
  31.               JOIN AdventureWorks2008R2.Production.Product AS p
  32.               ON wo.ProductID = p.ProductID
  33.               WHERE p.ProductID = 722 + @contador
  34.            --   WHERE DueDate > '2006-04-30'
  35.            --     AND DATEDIFF(dd, '2006-04-30', DueDate) < 2
  36.               ORDER BY DueDate ASC,
  37.                        (p.ListPrice - p.StandardCost) * wo.OrderQty DESC
  38.               FOR XML PATH('tr'), TYPE
  39.     ) AS NVARCHAR(MAX) ) +
  40.     N'</table>' ;
  41.  
  42. UPDATE MailsToBeSent SET  body = @tableHTML, fecha = @fecha WHERE MailID = @contador
  43. SET @contador = @contador +1
  44. END
  45.    SELECT * FROM MailsToBeSent
  46.  
  47. END

Como pueden darse cuenta aquí uso hasta while y me ejecuta genial!!

Procedimiento almacenado para la BD produccion:

Código SQL:
Ver original
  1. ALTER  PROCEDURE proc_enviarCorreo2
  2. AS
  3. BEGIN
  4.  
  5.  
  6. DECLARE @fecha DATE  
  7. DECLARE @tableHTML  VARCHAR(4000) ;  
  8. --set @fecha= (select CONVERT(VARCHAR(10), GETDATE(), 105))
  9. SET @tableHTML  =  
  10.    N'<head>' +  
  11. 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>' +  
  12.    N'<h2><font color="#0000ff" size="4">Work Order Report   </font></h2>'+  
  13.    N'</head>' +  
  14. N'<body>' +  
  15. N' <hr> ' +  
  16. N' ' +  
  17.     N'<table border="1">' +  
  18.     N'<tr><th> ID</th><th> Fecha </th>' +  
  19.     N'<th>Nombre de Base </th><th> Nombre Del Backup </th><th> Tipo</th>' +  
  20.     N'
  21.    </tr>' +  
  22.     CAST ( ( SELECT top 20  td = wo.id,       ''
  23.               --      td =  CONVERT(VARCHAR(10), fecha, 105) , '',  
  24.              --       td = Base, '',  
  25.               --      td = nombre_bk, '',  
  26.         --            td = Tipo, ''
  27.            FROM backups  AS wo  
  28.           --    where CONVERT(VARCHAR(10), fecha, 105)  = @fecha
  29.             FOR XML PATH('tr'), TYPE  
  30.    ) AS NVARCHAR(MAX) ) +  
  31.     N'</table>' ;  
  32. --print @tableHTML
  33. UPDATE EnviarCorreo  SET  body = @tableHTML
  34.  
  35. SELECT * FROM EnviarCorreo  
  36. 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
  1. FOR XML PATH('tr'), TYPE  
  2.    ) AS NVARCHAR(MAX) ) +

Alguna sugerencia, comentario u.u .. saludos,