none
Criar tabela a partir de Pivot Dinâmico RRS feed

  • Pergunta

  • Boa tarde, amigos.

    Tenho uma Stored Procedure que executa um Pivot dinâmico em uma das tabelas do banco. Porém, não estou conseguindo mostrá-las na minha aplicação, pois não acontece um select em uma tabela, e não retorna nada no select.

    Gostaria de saber se é possível eu passar o retorno dessa procedure para uma tabela temporária. Pode ser até na mesma procedure. Vejam como está atualemente:

    DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
    DECLARE @ColumnName AS NVARCHAR(MAX)
     
    SELECT @ColumnName= ISNULL(@ColumnName + ',','')
           + QUOTENAME(MES)
    FROM 
    (
    SELECT DISTINCT
    DATEPART(MONTH, data_saida) AS MES
    FROM ComprasSaidaMaterial csm
    WHERE DATEPART(MONTH, data_saida) BETWEEN (DATEPART(MONTH, GETDATE()) - 3) AND (DATEPART(MONTH, GETDATE()) - 1)
    ) AS COMPRASSAIDA
     
    SET @DynamicPivotQuery =
      N'SELECT IDPRODUTO, PRODUTO, MARCA, ' + @ColumnName + '
        FROM 
    	(
    	SELECT 
    csm.id_produto AS IDPRODUTO,
    cp.descricao AS PRODUTO,
    cp.marca AS MARCA,
    DATEPART(MONTH, data_saida) AS MES,
    SUM(qtde) AS SAIDA
    FROM ComprasSaidaMaterial csm
    JOIN ComprasProdutos cp ON cp.id_produto = csm.id_produto
    WHERE DATEPART(MONTH, data_saida) BETWEEN (DATEPART(MONTH, GETDATE()) - 3) AND (DATEPART(MONTH, GETDATE()) - 1)
    GROUP BY
    csm.id_produto,
    cp.descricao,
    cp.marca,
    DATEPART(MONTH, data_saida)
    	) X
        PIVOT(SUM
    	(SAIDA)
              FOR MES IN (' + @ColumnName + ')) AS PVTTable'
    
    EXECUTE(@DynamicPivotQuery)

    Gostaria de dropar a tabela antes de tudo, e no final repopular essa tabela com o resultado obtido.

    Obrigado


    Leonardo D'Amato

    quarta-feira, 10 de setembro de 2014 16:50

Respostas

  • Leonardo,

    Segue um exemplo...

    create table #temp
    (
    disco char(1),
    livre int
    )

    insert #temp
    exec xp_fixeddrives

    select disco, livre
    from #temp


    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote

    quarta-feira, 10 de setembro de 2014 17:18
  • Leonardo,

    Se a quantidade de registros for pequena, você poderá utilizar uma variável do tipo "table". Neste caso, não há I/O em disco e também não é necessário verificar se existe para dropar e recriar a tabela (ou truncar seus dados).

    Também passa ser opcional o uso de Transações, já que não há possibilidade de uma consulta concorrente execute um drop table enquanto não foi finalizada a consulta no primeiro contexto por outro usuário.

    Segue abaixo uma sugestão para adaptar ao seu script T-SQL:

    ...

    DECLARE @RESULTADO TABLE ( IDPRODUTO int,
    PRODUTO varchar(50),
    MARCA    varchar(50),
    COLUNA varchar(200) ) INSERT INTO @RESULTADO (IDPRODUTO, PRODUTO, MARCA, COLUNA) EXEC(@DynamicPivotQuery)

    ...


    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    quarta-feira, 10 de setembro de 2014 19:39
    Moderador

Todas as Respostas

  • Leonardo,

    Segue um exemplo...

    create table #temp
    (
    disco char(1),
    livre int
    )

    insert #temp
    exec xp_fixeddrives

    select disco, livre
    from #temp


    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote

    quarta-feira, 10 de setembro de 2014 17:18
  • Leonardo,

    Se a quantidade de registros for pequena, você poderá utilizar uma variável do tipo "table". Neste caso, não há I/O em disco e também não é necessário verificar se existe para dropar e recriar a tabela (ou truncar seus dados).

    Também passa ser opcional o uso de Transações, já que não há possibilidade de uma consulta concorrente execute um drop table enquanto não foi finalizada a consulta no primeiro contexto por outro usuário.

    Segue abaixo uma sugestão para adaptar ao seu script T-SQL:

    ...

    DECLARE @RESULTADO TABLE ( IDPRODUTO int,
    PRODUTO varchar(50),
    MARCA    varchar(50),
    COLUNA varchar(200) ) INSERT INTO @RESULTADO (IDPRODUTO, PRODUTO, MARCA, COLUNA) EXEC(@DynamicPivotQuery)

    ...


    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    quarta-feira, 10 de setembro de 2014 19:39
    Moderador