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 |