Ver Mensaje Individual
  #2 (permalink)  
Antiguo 25/09/2014, 07:44
Avatar de Libras
Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: procedimiento almacenado con tablas temporales

solucion sencilla usa tablas temporales globales, como haces eso usando ## en lugar de un solo #

Código SQL:
Ver original
  1. DECLARE
  2. @nro_cedide VARCHAR(20),@max_comprobante INT;
  3.  
  4. BEGIN
  5. --SET NOCOUNT ON;
  6. DECLARE crsr_cedula cursor FOR
  7. SELECT so.nro_cedide
  8. FROM cij.JM_SOLICITUD so, cij.JM_CONFORMACION fo, cij.JM_INFORME_FINAL i, cij.jm_resultado re, cij.JM_BENEFICIO be
  9. WHERE so.id_solicitud= fo.id_solicitud
  10. AND fo.id_conformacion= i.id_conformacion
  11. AND i.id_informe= re.id_informe
  12. AND re.id_beneficio= be.id_beneficio
  13. AND i.estado='FIN'
  14. AND re.id_beneficio IN (4,5,6,8,9)
  15. IF @@error != 0
  16. BEGIN
  17. raiserror 99999 'ERROR las cedulas de las personas con informes finalizados'
  18. END;
  19.  
  20. --ABRIMOS CURSOR
  21. OPEN crsr_cedula;
  22. IF @@error != 0
  23. BEGIN
  24. raiserror 99999 'ERROR al abrir el cursor pp'
  25. END
  26.  
  27. --RECORREMOS EL CURSOR
  28. fetch NEXT FROM crsr_cedula INTO @nro_cedide
  29. IF @@fetch_status = -1
  30. BEGIN
  31. raiserror 99999 ' Error al recorrer cursor[inicio]'
  32. END;
  33.  
  34. while @@fetch_status = 0
  35. BEGIN
  36. --recuperamos el ultimo comprobante afectado de la persona
  37. SELECT @max_comprobante = MAX(comprobante_pago)
  38. FROM cij.BENEFICIARIOS x, cij.BENEFICIARIOS_GRUPOS y, cij.COMPROBANTES_PAGOS z
  39. WHERE x.beneficiario = y.beneficiario
  40. AND y.beneficiario_grupo = z.beneficiario_grupo
  41. AND z.indicador_estado = 'VAL'
  42. AND x.cedula = @nro_cedide
  43. IF @@error != 0
  44. BEGIN
  45. raiserror 99999 'Error al recuperar el maximo comprobante de la persona'
  46. END;
  47.  
  48. IF @max_comprobante IS NOT NULL
  49. BEGIN
  50.  
  51. CREATE TABLE ##beneficios(cedula VARCHAR(20),nombre VARCHAR(70),fec_nac datetime,fec_ini datetime,fec_fin datetime,descripcion VARCHAR(70),resolucion VARCHAR(20))
  52. INSERT INTO ##beneficios
  53. SELECT a.cedula, a.nombre_completo, a.fecha_nacimiento, d.fecha_inicio, d.fecha_fin, e.descripcion concepto_asignacion,d.numero_resolucion
  54. FROM cij.BENEFICIARIOS a, cij.BENEFICIARIOS_GRUPOS b, cij.COMPROBANTES_PAGOS c, cij.COMPROBANTES_PAGOS_DETALLE d, cij.CONCEPTOS_ASIGNACIONES e
  55. WHERE a.beneficiario = b.beneficiario
  56. AND b.beneficiario_grupo = c.beneficiario_grupo
  57. AND c.comprobante_pago = d.comprobante_pago
  58. AND d.concepto_asignacion = e.concepto_asignacion
  59. AND d.indicador_tipo = 'CRE'
  60. AND c.comprobante_pago = @max_comprobante
  61. IF @@error != 0
  62. BEGIN
  63. raiserror 99999 'Error al insertar en la tabla temporal'
  64. END;
  65.  
  66. END;
  67.  
  68. fetch NEXT FROM crsr_cedula INTO @nro_cedide
  69. END
  70.  
  71. --CERRAMOS EL CURSOR
  72. close crsr_cedula
  73. deallocate crsr_cedula
  74.  
  75. SELECT cedula,nombre,fec_nac,fec_ini,fec_fin,descripcion, resolucion FROM ##beneficios;
  76. END

ahora la pregunta del millon, porque se muere la tabla temporal y no la puedes ver despues?? porque una tabla temporal vive dentro de la sesion que la mando construir, como fue construida dentro del cursor cuando salga de este ya no existe, el otro modo de solucionarlo sin usar temporales globales es este:

Código SQL:
Ver original
  1. DECLARE
  2. @nro_cedide VARCHAR(20),@max_comprobante INT;
  3.  
  4. BEGIN
  5. --SET NOCOUNT ON;
  6.  
  7. CREATE TABLE #beneficios(cedula VARCHAR(20),nombre VARCHAR(70),fec_nac datetime,fec_ini datetime,fec_fin datetime,descripcion VARCHAR(70),resolucion VARCHAR(20))
  8.  
  9. DECLARE crsr_cedula cursor FOR
  10. SELECT so.nro_cedide
  11. FROM cij.JM_SOLICITUD so, cij.JM_CONFORMACION fo, cij.JM_INFORME_FINAL i, cij.jm_resultado re, cij.JM_BENEFICIO be
  12. WHERE so.id_solicitud= fo.id_solicitud
  13. AND fo.id_conformacion= i.id_conformacion
  14. AND i.id_informe= re.id_informe
  15. AND re.id_beneficio= be.id_beneficio
  16. AND i.estado='FIN'
  17. AND re.id_beneficio IN (4,5,6,8,9)
  18. IF @@error != 0
  19. BEGIN
  20. raiserror 99999 'ERROR las cedulas de las personas con informes finalizados'
  21. END;
  22.  
  23. --ABRIMOS CURSOR
  24. OPEN crsr_cedula;
  25. IF @@error != 0
  26. BEGIN
  27. raiserror 99999 'ERROR al abrir el cursor pp'
  28. END
  29.  
  30. --RECORREMOS EL CURSOR
  31. fetch NEXT FROM crsr_cedula INTO @nro_cedide
  32. IF @@fetch_status = -1
  33. BEGIN
  34. raiserror 99999 ' Error al recorrer cursor[inicio]'
  35. END;
  36.  
  37. while @@fetch_status = 0
  38. BEGIN
  39. --recuperamos el ultimo comprobante afectado de la persona
  40. SELECT @max_comprobante = MAX(comprobante_pago)
  41. FROM cij.BENEFICIARIOS x, cij.BENEFICIARIOS_GRUPOS y, cij.COMPROBANTES_PAGOS z
  42. WHERE x.beneficiario = y.beneficiario
  43. AND y.beneficiario_grupo = z.beneficiario_grupo
  44. AND z.indicador_estado = 'VAL'
  45. AND x.cedula = @nro_cedide
  46. IF @@error != 0
  47. BEGIN
  48. raiserror 99999 'Error al recuperar el maximo comprobante de la persona'
  49. END;
  50.  
  51. IF @max_comprobante IS NOT NULL
  52. BEGIN
  53.  
  54.  
  55. INSERT INTO #beneficios
  56. SELECT a.cedula, a.nombre_completo, a.fecha_nacimiento, d.fecha_inicio, d.fecha_fin, e.descripcion concepto_asignacion,d.numero_resolucion
  57. FROM cij.BENEFICIARIOS a, cij.BENEFICIARIOS_GRUPOS b, cij.COMPROBANTES_PAGOS c, cij.COMPROBANTES_PAGOS_DETALLE d, cij.CONCEPTOS_ASIGNACIONES e
  58. WHERE a.beneficiario = b.beneficiario
  59. AND b.beneficiario_grupo = c.beneficiario_grupo
  60. AND c.comprobante_pago = d.comprobante_pago
  61. AND d.concepto_asignacion = e.concepto_asignacion
  62. AND d.indicador_tipo = 'CRE'
  63. AND c.comprobante_pago = @max_comprobante
  64. IF @@error != 0
  65. BEGIN
  66. raiserror 99999 'Error al insertar en la tabla temporal'
  67. END;
  68.  
  69. END;
  70.  
  71. fetch NEXT FROM crsr_cedula INTO @nro_cedide
  72. END
  73.  
  74. --CERRAMOS EL CURSOR
  75. close crsr_cedula
  76. deallocate crsr_cedula
  77.  
  78. SELECT cedula,nombre,fec_nac,fec_ini,fec_fin,descripcion, resolucion FROM #beneficios;
  79. END

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me