solucion sencilla usa tablas temporales globales, como haces eso usando ## en lugar de un solo #
Código SQL:
Ver originalDECLARE
@nro_cedide VARCHAR(20),@max_comprobante INT;
BEGIN
--SET NOCOUNT ON;
DECLARE crsr_cedula cursor FOR
SELECT so.nro_cedide
FROM cij.JM_SOLICITUD so, cij.JM_CONFORMACION fo, cij.JM_INFORME_FINAL i, cij.jm_resultado re, cij.JM_BENEFICIO be
WHERE so.id_solicitud= fo.id_solicitud
AND fo.id_conformacion= i.id_conformacion
AND i.id_informe= re.id_informe
AND re.id_beneficio= be.id_beneficio
AND i.estado='FIN'
AND re.id_beneficio IN (4,5,6,8,9)
IF @@error != 0
BEGIN
raiserror 99999 'ERROR las cedulas de las personas con informes finalizados'
END;
--ABRIMOS CURSOR
OPEN crsr_cedula;
IF @@error != 0
BEGIN
raiserror 99999 'ERROR al abrir el cursor pp'
END
--RECORREMOS EL CURSOR
fetch NEXT FROM crsr_cedula INTO @nro_cedide
IF @@fetch_status = -1
BEGIN
raiserror 99999 ' Error al recorrer cursor[inicio]'
END;
while @@fetch_status = 0
BEGIN
--recuperamos el ultimo comprobante afectado de la persona
SELECT @max_comprobante = MAX(comprobante_pago)
FROM cij.BENEFICIARIOS x, cij.BENEFICIARIOS_GRUPOS y, cij.COMPROBANTES_PAGOS z
WHERE x.beneficiario = y.beneficiario
AND y.beneficiario_grupo = z.beneficiario_grupo
AND z.indicador_estado = 'VAL'
AND x.cedula = @nro_cedide
IF @@error != 0
BEGIN
raiserror 99999 'Error al recuperar el maximo comprobante de la persona'
END;
IF @max_comprobante IS NOT NULL
BEGIN
CREATE TABLE ##beneficios(cedula VARCHAR(20),nombre VARCHAR(70),fec_nac datetime,fec_ini datetime,fec_fin datetime,descripcion VARCHAR(70),resolucion VARCHAR(20))
INSERT INTO ##beneficios
SELECT a.cedula, a.nombre_completo, a.fecha_nacimiento, d.fecha_inicio, d.fecha_fin, e.descripcion concepto_asignacion,d.numero_resolucion
FROM cij.BENEFICIARIOS a, cij.BENEFICIARIOS_GRUPOS b, cij.COMPROBANTES_PAGOS c, cij.COMPROBANTES_PAGOS_DETALLE d, cij.CONCEPTOS_ASIGNACIONES e
WHERE a.beneficiario = b.beneficiario
AND b.beneficiario_grupo = c.beneficiario_grupo
AND c.comprobante_pago = d.comprobante_pago
AND d.concepto_asignacion = e.concepto_asignacion
AND d.indicador_tipo = 'CRE'
AND c.comprobante_pago = @max_comprobante
IF @@error != 0
BEGIN
raiserror 99999 'Error al insertar en la tabla temporal'
END;
END;
fetch NEXT FROM crsr_cedula INTO @nro_cedide
END
--CERRAMOS EL CURSOR
close crsr_cedula
deallocate crsr_cedula
SELECT cedula,nombre,fec_nac,fec_ini,fec_fin,descripcion, resolucion FROM ##beneficios;
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 originalDECLARE
@nro_cedide VARCHAR(20),@max_comprobante INT;
BEGIN
--SET NOCOUNT ON;
CREATE TABLE #beneficios(cedula VARCHAR(20),nombre VARCHAR(70),fec_nac datetime,fec_ini datetime,fec_fin datetime,descripcion VARCHAR(70),resolucion VARCHAR(20))
DECLARE crsr_cedula cursor FOR
SELECT so.nro_cedide
FROM cij.JM_SOLICITUD so, cij.JM_CONFORMACION fo, cij.JM_INFORME_FINAL i, cij.jm_resultado re, cij.JM_BENEFICIO be
WHERE so.id_solicitud= fo.id_solicitud
AND fo.id_conformacion= i.id_conformacion
AND i.id_informe= re.id_informe
AND re.id_beneficio= be.id_beneficio
AND i.estado='FIN'
AND re.id_beneficio IN (4,5,6,8,9)
IF @@error != 0
BEGIN
raiserror 99999 'ERROR las cedulas de las personas con informes finalizados'
END;
--ABRIMOS CURSOR
OPEN crsr_cedula;
IF @@error != 0
BEGIN
raiserror 99999 'ERROR al abrir el cursor pp'
END
--RECORREMOS EL CURSOR
fetch NEXT FROM crsr_cedula INTO @nro_cedide
IF @@fetch_status = -1
BEGIN
raiserror 99999 ' Error al recorrer cursor[inicio]'
END;
while @@fetch_status = 0
BEGIN
--recuperamos el ultimo comprobante afectado de la persona
SELECT @max_comprobante = MAX(comprobante_pago)
FROM cij.BENEFICIARIOS x, cij.BENEFICIARIOS_GRUPOS y, cij.COMPROBANTES_PAGOS z
WHERE x.beneficiario = y.beneficiario
AND y.beneficiario_grupo = z.beneficiario_grupo
AND z.indicador_estado = 'VAL'
AND x.cedula = @nro_cedide
IF @@error != 0
BEGIN
raiserror 99999 'Error al recuperar el maximo comprobante de la persona'
END;
IF @max_comprobante IS NOT NULL
BEGIN
INSERT INTO #beneficios
SELECT a.cedula, a.nombre_completo, a.fecha_nacimiento, d.fecha_inicio, d.fecha_fin, e.descripcion concepto_asignacion,d.numero_resolucion
FROM cij.BENEFICIARIOS a, cij.BENEFICIARIOS_GRUPOS b, cij.COMPROBANTES_PAGOS c, cij.COMPROBANTES_PAGOS_DETALLE d, cij.CONCEPTOS_ASIGNACIONES e
WHERE a.beneficiario = b.beneficiario
AND b.beneficiario_grupo = c.beneficiario_grupo
AND c.comprobante_pago = d.comprobante_pago
AND d.concepto_asignacion = e.concepto_asignacion
AND d.indicador_tipo = 'CRE'
AND c.comprobante_pago = @max_comprobante
IF @@error != 0
BEGIN
raiserror 99999 'Error al insertar en la tabla temporal'
END;
END;
fetch NEXT FROM crsr_cedula INTO @nro_cedide
END
--CERRAMOS EL CURSOR
close crsr_cedula
deallocate crsr_cedula
SELECT cedula,nombre,fec_nac,fec_ini,fec_fin,descripcion, resolucion FROM #beneficios;
END
saludos!