Ver Mensaje Individual
  #11 (permalink)  
Antiguo 03/08/2010, 15:27
anarchy9902
 
Fecha de Ingreso: abril-2005
Mensajes: 5
Antigüedad: 19 años
Puntos: 0
Respuesta: problemas con el SP_executesql

Que tal amigos, bueno revisando los comentarios y encontrando una solución a mi problema con el SP_EXECUTESQL en este foro pues lo que yo queria es que funcione con un cursor dinámico , bueno dejo el procedure que he desarrollado a mi necesidad

donde muestro el uso del SP_EXECUTESQL y exec o execute que conocemos

saludos...

ALTER PROCEDURE [dbo].[SSP_RPT_CONSOL_COMUN]
@IDOFICINA VARCHAR(4),
@CONDICION VARCHAR(500),
@GFFILTROS VARCHAR(500)
AS
BEGIN

DECLARE @DESCCOMUNIC VARCHAR(10)
DECLARE @SQL_ALTER NVARCHAR(MAX)
DECLARE @TOT_CONSULTA VARCHAR(20)
DECLARE @COD AS VARCHAR(20)
DECLARE @GF AS VARCHAR(20)
DECLARE @CAMPOS AS VARCHAR(50)
DECLARE @CONT AS INT
DECLARE @CAMP AS VARCHAR(50)
DECLARE @my_cur CURSOR

create table #TABLA_TMP (NRO varchar(20),COD varchar(50),NOMBRES varchar(200),GF varchar(20),EJECUTADO int)

SET NOCOUNT ON;
SET @SQL_ALTER='INSERT INTO #TABLA_TMP
SELECT ROW_NUMBER() OVER(PARTITION BY X ORDER BY NOMBRES ASC) AS NRO ,
COD,NOMBRES,GF,EJECUTADO
FROM (
SELECT (CASE WHEN COD_EMP1 IS NULL OR COD_EMP1='''' THEN ''X'' ELSE COD_EMP1 END) COD,
ISNULL(NOM_EMP1,'''')NOMBRES,GF,
COUNT(*)EJECUTADO,''X'' X
FROM COMUNICADET A
WHERE ESTADO IN(''D'',''E'') AND IDOFICINA='+@IDOFICINA+@CONDICION+' GROUP BY COD_EMP1,NOM_EMP1,GF )A ORDER BY 3'

EXECUTE (@SQL_ALTER)

SET @CONT=0

SET @SQL_ALTER=N'SET @my_cur = CURSOR STATIC FOR
SELECT DESCCOMUNIC FROM TIPOCOMUNIC WHERE ESTADO=''A'' AND IDTIP<>''00'' '+@GFFILTROS+' ORDER BY 1;
OPEN @my_cur'

EXEC sp_executesql
@SQL_ALTER,
N'@my_cur cursor OUTPUT', @my_cur OUTPUT

FETCH NEXT FROM @my_cur

into @DESCCOMUNIC
while @@fetch_status = 0
begin
SET @CONT=@CONT+1

SET @CAMP=@DESCCOMUNIC

IF @CONT=1
SET @CAMPOS=@DESCCOMUNIC
ELSE
BEGIN
IF LEN(LTRIM(RTRIM(@DESCCOMUNIC)))>0
SET @CAMPOS=LTRIM(RTRIM(@CAMPOS))+','+LTRIM(RTRIM(@CAM P))
END

SET @SQL_ALTER='ALTER TABLE #TABLA_TMP ADD '+ @DESCCOMUNIC +' INT'
-- Avanzamos otro registro
EXECUTE(@SQL_ALTER)
SET @SQL_ALTER='UPDATE #TABLA_TMP SET '+ @DESCCOMUNIC +' =0'
EXECUTE(@SQL_ALTER)
/*************************************************/
/*************************************************/
declare CURSOR_TMP cursor for SELECT COD,GF FROM #TABLA_TMP
open CURSOR_TMP
-- Avanzamos un registro y cargamos en las variables los valores encontrados en el primer registro
fetch next from CURSOR_TMP
into @COD,@GF
while @@fetch_status = 0
begin
SELECT @TOT_CONSULTA=isnull(EJECUTADO,'0') FROM #TABLA_TMP WHERE GF=RTRIM(@DESCCOMUNIC) and cod=rtrim(@COD)

IF len(ltrim(rtrim(@TOT_CONSULTA)))>0
BEGIN
SET @SQL_ALTER='UPDATE #TABLA_TMP SET '+@DESCCOMUNIC+'='+ISNULL(@TOT_CONSULTA,'0') +' WHERE cod=rtrim('''+@COD+''')'
execute(@SQL_ALTER)
SET @COD=''
SET @TOT_CONSULTA=''
SET @SQL_ALTER=''
END
fetch next from CURSOR_TMP
into @COD,@GF
end
-- cerramos el cursor
close CURSOR_TMP
deallocate CURSOR_TMP
/*************************************************/
/*************************************************/

fetch next from @my_cur
into @DESCCOMUNIC
end
-- cerramos el cursor
close @my_cur
deallocate @my_cur

SET @SQL_ALTER=' SELECT ROW_NUMBER() OVER(PARTITION BY X ORDER BY NOMBRES ASC) AS NRO,
COD CODIGO,NOMBRES,'+ISNULL(@CAMPOS,'')+',TOTAL '+
' FROM (SELECT DISTINCT ''X'' X,COD,NOMBRES,'+
ISNULL(@CAMPOS,'')+','+REPLACE(@CAMPOS,',','+')+
' AS TOTAL FROM #TABLA_TMP)A ORDER BY NOMBRES'

execute(@SQL_ALTER)

END