Procedimientos almacenados

Hola, hace rato envié esta pregunta pero me marcó un arrero, así que no se si la estoy repitiendo, en fin, espero que me pueda ayudar a solucionar el problema de la sig. Consulta:
OPEN TIPO_SOLICITUD
FETCH NEXT FROM TIPO_SOLICITUD
INTO @CVE
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @TIP_SOL = (SELECT NOMBRE FROM TIPO_SOLICITUD WHERE CVE_TSOL = @CVE)
SELECT 'SOLICITUDES' = @TIP_SOL
FETCH NEXT FROM TIPO_SOLICITUD
INTO @CVE
END
El caso es que la salida de esta consulta solo me da la información por separado, es decir, como si ejecutara el proc. El num de registro que contenga la tabla, yo supongo que no estoy aplicando bien el select; lo que necesito es que al ejecutar el proc. Se visualicen los num. De registros en forma secuencial... ¿me podría ayudar?,
se lo agradeceré mucho.
Marina

1 Respuesta

Respuesta
1
Estás haciendo un select por cada iteración del bucle, para que te dé la lista seguida tienes que hacer un único select. Esto lo puedes hacer insertando los valores en un tabla temporal y presentándolo al final.
Pero por la pinta que tiene, creo que te puedes evitar el cursor y hacerlo todo en la misma consulta. No estoy seguro porque no me has mandado la declaración del cursor. Intentalo y si no, mandame la declaración y lo intento.
Muchas veces se pueden evitar los cursores con una consulta un poco más compleja y, aunque a primera vista parezca una solución más complicada, al final es todo lo contrario, da más rendimiento y consume menos recursos.
Te mando el procedimiento completo para ver si es posible que me lo puedas optimizar, te lo agradeceré mucho.
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
ALTER PROCEDURE SPSEL_CONSULTA
@FINI DATETIME, @FFIN DATETIME OUTPUT
AS
DECLARE @CVE INT, @TIP_SOL VARCHAR (30)
DECLARE TIPO_SOLICITUD CURSOR FOR
SELECT CVE_TSOL FROM TIPO_SOLICITUD
OPEN TIPO_SOLICITUD
FETCH NEXT FROM TIPO_SOLICITUD
INTO @CVE
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @TIP_SOL = (SELECT NOMBRE FROM TIPO_SOLICITUD WHERE CVE_TSOL = @CVE)
SELECT 'SOLICITUDES' = @TIP_SOL
FETCH NEXT FROM TIPO_SOLICITUD
INTO @CVE
END
CLOSE TIPO_SOLICITUD
DEALLOCATE TIPO_SOLICITUD
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Saludos
Marina
Creo que el campo CVE_TSOL es la clave de la tabla. Luego lo que obtienes es una lista de todos los tipos de solicitud.
¿No bastaría entonces hacer un select sin usar cursores?
El procedimiento quedaría así:
ALTER PROCEDURE SPSEL_CONSULTA
@FINI DATETIME, @FFIN DATETIME OUTPUT
AS
SELECT NOMBRE FROM TIPO_SOLICITUD
Perdón por no saber me explicar lo que pasa es que además de esos valores necesito otros de otra tabla, solo que pensé que al ponerme un ejemplo yo podría con lo demás pero escogí los datos incorrectos, trataré de explicarme nuevamente:
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
ALTER PROCEDURE SPSEL_CONSULTA
@FINI DATETIME, @FFIN DATETIME OUTPUT
AS
DECLARE @CVE INT, @TIP_SOL VARCHAR (30), @SEM_ACTUAL INT, @SEM_ANT INT, @TRAM_ACT INT
DECLARE TIPO_SOLICITUD CURSOR FOR
SELECT CVE_TSOL FROM TIPO_SOLICITUD
OPEN TIPO_SOLICITUD
FETCH NEXT FROM TIPO_SOLICITUD
INTO @CVE
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @TIP_SOL = (SELECT NOMBRE FROM TIPO_SOLICITUD WHERE CVE_TSOL = @CVE)
SET @SEM_ACTUAL = (SELECT COUNT(*) FROM SOLICITUDES WHERE CVE_TSOL = @CVE AND FE_SOL >= @FINI AND FE_SOL <= @FFIN)
SET @SEM_ANT = (SELECT COUNT(*) FROM SOLICITUDES WHERE CVE_TSOL = @CVE AND FE_SOL >= @FINI -7 AND FE_SOL <= @FINI - 1 AND EDO_SOL = 'P')
SET @TRAM_ACT = (SELECT COUNT(*) FROM SOLICITUDES WHERE CVE_TSOL = @CVE AND FE_TERM >= @FINI AND FE_TERM <= @FFIN)
SELECT 'SOLICITUDES' = @TIP_SOL, 'SEM_ACTUAL' = @SEM_ACTUAL, 'SEM_ANT' = @SEM_ANT, 'TRAM_ACTUAL' = @TRAM_ACT
FETCH NEXT FROM TIPO_SOLICITUD
INTO @CVE
END
CLOSE TIPO_SOLICITUD
DEALLOCATE TIPO_SOLICITUD
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Espero que no se mucha molestia
Saludos
Marina
Ya me extrañaba. De todas formas puedes hacer una consulta para todo utilizando Joins.
Desde el administrador corporativo se hace cómodamente, ya que puedes ir poniendo tablas y estableciendo relaciones de manera parecida a como se hace en Access. Prueba a crear una vista aunque después no la guardes, cuando tengas el resultado que quieres, te copias la consulta, la pegas en el SP y lo modificas para ponerle los parámetros en el where. Yo suelo trabajar así y es curioso las consultas que se pueden crear sin tocar una tecla. Pruébalo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas