none
EXECUTE( SELECT * FROM @TABLA_TEMPORAL) COMO HACERLA? RRS feed

  • Pregunta

  • MUY BUENOS DÍAS, ESTOY PRESENTANDO UN PROBLEMA AL HACER UNA CONSULTA Y QUERER HACER UN EXECUTE A UN SELECT QUE EVOCA A UNA TABLA TEMPORAL(LA TABLA TEMPORAL LA CREE ANTES Y LA PROBE Y FUNCIONA PERFECTAMENTE EL PROBLEMA ME DA ÚNICAMENTE CUANDO LA QUIERO METER DENTRO DEL EXECUTE), QUISIERA QUE VIERAN MI CASO Y ME DEN SU OPINIÓN DE COMO REFERENCIAR ESTA TABLA Y QUE DE EL RESULTADO.

    LA INTENCION DE METERLA EN EL EXECUTE ES PODER LUEGO HACER UN PIVOT DINAMICO CON ESA CONSULTA Y PODER REFERENCIARLE DE MANERA CONCATENADA AL PIVOT LA VARIABLE ESA QUE CREE ALLI LLAMADA @Tipo_de_Gastos

    MI CONSULTA ES LA SIGUIENTE:

    SET @GastosDetallados = @GastosDetallados +' DECLARE @Tabla_GastosDetallados AS TABLE ( embId VARCHAR(30), artId             VARCHAR(50), tgaNombre VARCHAR(60), tgaId int, Gastos DECIMAL(18,7) )'+@ENTER
    SET @GastosDetallados = @GastosDetallados +' INSERT INTO @Tabla_GastosDetallados ( embId, artId, tgaNombre, tgaId,             Gastos )'+@ENTER
    SET @GastosDetallados = @GastosDetallados + ' SELECT imqHojaCostoAuxiliar.embId , imqHojaCostoAuxiliar.artId,                         imtTipoGastos.tgaNombre, imqHojaCostoAuxiliar.tgaId, ' +@ENTER
    SET @GastosDetallados = @GastosDetallados + ' SUM(imqHojaCostoAuxiliar.Gastos) AS Gastos ' +@ENTER
    SET @GastosDetallados = @GastosDetallados + ' FROM ('+ @imqHojaCostoAuxiliar +') AS imqHojaCostoAuxiliar LEFT JOIN             imtTipoGastos ON imtTipoGastos.tgaId = imqHojaCostoAuxiliar.tgaId ' +@ENTER
    SET @GastosDetallados = @GastosDetallados + ' GROUP BY imqHojaCostoAuxiliar.embId , imtTipoGastos.tgaNombre,                   imqHojaCostoAuxiliar.artId , imqHojaCostoAuxiliar.tgaId ' +@ENTER
    SET @GastosDetallados = @GastosDetallados + ' DECLARE @Tipo_de_Gastos VARCHAR(MAX) = '''' '+@ENTER

    --------------------------------- CREO LA CADENA DE DE PIVOT DE MANERA DINAMICA ---------------------------------------------------------------
    SET @GastosDetallados = @GastosDetallados + ' SELECT @Tipo_de_Gastos = @Tipo_de_Gastos +''[''+ T.tgaNombre +''],'' FROM ' +@ENTER
    SET @GastosDetallados = @GastosDetallados + ' ( SELECT DISTINCT tgaNombre from @Tabla_GastosDetallados ) AS T '+@ENTER
    SET @GastosDetallados = @GastosDetallados + ' SET @Tipo_de_Gastos = LEFT( @Tipo_de_Gastos, LEN(@Tipo_de_Gastos)-1 ) '+@ENTER
    --SET @GastosDetallados = @GastosDetallados + ' SELECT @Tipo_de_Gastos '+@ENTER
    SET @GastosDetallados = @GastosDetallados + ' EXECUTE (''SELECT * FROM ( SELECT embId, artId, tgaId, tgaNombre, Gastos FROM  (@Tabla_GastosDetallados) ) AS U  '') ' +@ENTER
    --SET @GastosDetallados = @GastosDetallados + ' PIVOT ( MAX(Gastos) FOR [tgaNombre] IN ([ALMACENAJE]) ) AS Pivot_Auxiliar'') ' +@ENTER

    --------------------------------- YA AQUI ESTA CREADA LA CADENA DE PIVOT DINAMICO -------------------------------------------------------------

    EXECUTE(@strSql+@GastosDetallados+@GastosDetalladosTEMP)
    miércoles, 18 de marzo de 2020 22:49

Todas las respuestas

  • Hola PIVOT DINAMICOS EN SQL SERVER 20XX PREGUNTAS:

    Lo que has creado no es una tabla temporal, sino una variable tipo tabla.

    SET @GastosDetallados = @GastosDetallados + ' EXECUTE (''SELECT * FROM ( SELECT embId, artId, tgaId, tgaNombre, Gastos FROM  (@Tabla_GastosDetallados) ) AS U  '') ' +@ENTER

    No me parece que eso te funcione correctamente.

    ¿Porqué haces un execute y no un simple select? Si dinámicamente se rellenan los sets, por ejemplo, porque no se va a rellenar con un Select

    create table t (id int)
    go
    insert into t (id)
    values (1);
    go
    Declare @table table (id int)
    Declare @sql nvarchar(4000)
    set @sql =  'insert into @table (id) select id from t';
    Exec sp_executesql @sql;
    
    select * from @table

    Mens. 1087, Nivel 15, Estado 2, Línea 6
    Debe declarar la variable de tabla '@table'.

    (0 filas afectadas)

    Pero con una tabla temporal

    drop table if exists #table;
    create table #table (id int)
    Declare @sql nvarchar(4000)
    set @sql =  'insert into #table (id) select id from t';
    Exec sp_executesql @sql;
    
    select * from #table

    (1 fila afectada)
    id
    -----------
    1

    (1 fila afectada)

    A la hora de ejecutar el procedure dinámico la variable no existe, porque ya esta fuera de contexto.

    Si quieres utilizar ese tipo de elementos temporales, es más fácil, con tablas temporales.

    Create Table #GastosDetallados (.....)

    O tablas temporales Globales

    Create Table ##GastosDetallados (....)


    • Editado Javi Fernández F jueves, 19 de marzo de 2020 4:35
    • Propuesto como respuesta EricRR jueves, 19 de marzo de 2020 15:22
    jueves, 19 de marzo de 2020 4:29