Usuário com melhor resposta
É Possível criar uma tabela dinâmica a partir de um result set

Pergunta
-
Olá pessoal,
Preciso de um help em que preciso armazenar dados de um result set que é resultado de um PIVOT dinâmico, conforme o exemplo abaixo:
DECLARE @query VARCHAR(MAX)
-- Doing Dinamic Column
SET@query=''
SELECT@query=@query+'['+[a].[Column]+'], '
FROM
(SELECT DISTINCT
CONVERT(VARCHAR(2),
NomeTamanho) AS [Column]
FROM Tamanhos
)AS a
SET @query = LEFT(@query,len(@query)-1)
-- Doing query final with PIVOT
SET @query ='SELECT
Descricao,
CodProduto, '
+@query
+' FROM (SELECT P.Descricao, P.CodProduto, T.NomeTamanho, SUM(IP.Quant) QTDETOTAL '+
' FROM Produtos P, GradeProdutos GP, Tamanhos T, ItensPedidos IP '+
' WHERE P.CodProduto = GP.CodProduto '+
' AND P.CodProduto = IP.CodProduto '+
' AND GP.CodTamanho = T.CodTamanho '+
' AND IP.CodTamanho = T.CodTamanho '+
' AND SUBSTRING(P.CodProduto, 1,2 ) = ''CL'' '+
' AND SUBSTRING(P.CodProduto, 5,3 ) = ''053'' '+
' AND YEAR(P.DATA) >= 2012 '+
' GROUP BY P.CodProduto, P.Descricao, T.NomeTamanho '+') sq
PIVOT (SUM(QTDETOTAL) FOR NomeTamanho IN('+@query+')) AS pt'
EXEC (@query)Preciso armazenar os dados retornados de EXEC (@query) em uma tabela para juntar a outros dados depois.
Respostas
Todas as Respostas
-
-
É possível utilizar o SELECT INTO no seu SELECT porém todas as colunas devem estar com um alias.
Segue o exemplo de como ficaria o seu código:
DECLARE @query VARCHAR(MAX) -- Doing Dinamic Column SET@query='' SELECT@query=@query+'['+[a].[Column]+'], ' FROM (SELECT DISTINCT CONVERT(VARCHAR(2), NomeTamanho) AS [Column] FROM Tamanhos )AS a SET @query = LEFT(@query,len(@query)-1) -- Doing query final with PIVOT SET @query ='SELECT Descricao, CodProduto, ' +@query + ' INTO dbo.SuaTabela ' --//aqui coloca-se o nome da tabela a ser gerada a partir deste select +' FROM (SELECT P.Descricao, P.CodProduto, T.NomeTamanho, SUM(IP.Quant) QTDETOTAL '+ ' FROM Produtos P, GradeProdutos GP, Tamanhos T, ItensPedidos IP '+ ' WHERE P.CodProduto = GP.CodProduto '+ ' AND P.CodProduto = IP.CodProduto '+ ' AND GP.CodTamanho = T.CodTamanho '+ ' AND IP.CodTamanho = T.CodTamanho '+ ' AND SUBSTRING(P.CodProduto, 1,2 ) = ''CL'' '+ ' AND SUBSTRING(P.CodProduto, 5,3 ) = ''053'' '+ ' AND YEAR(P.DATA) >= 2012 '+ ' GROUP BY P.CodProduto, P.Descricao, T.NomeTamanho '+') sq PIVOT (SUM(QTDETOTAL) FOR NomeTamanho IN('+@query+')) AS pt' EXEC (@query)
Uma observação válida é que a tabela não pode existir na base. -
-
Adrian,
Obrigado pelo retorno, dessa forma consigo criar a tabela temporária porém somente durante a sessão. Se tentar acessar os dados após o EXEC a tabela já não está mais acessível, por exemplo para tabela = teste:
EXEC (@query)
SELECT * FROM #teste
Como preciso pegar esses dados dessa temp #teste para juntar com outros dados preciso acessá-la fora da sessão. Tem alguma idéia de como fazer isso? Tentei de várias formas aqui e não consegui.
Obrigado
Abraço,
-
-
Como o José Diz mencionou não é necessário que a tabela seja temporário no INSERT INTO, tudo irá depender de como vc quer criar a tabela, por exemplo se eu utilizar o comando:
SELECT 'a' AS col
INTO dbo.teste
Eu estou criando uma tabela física na base com os dados do SELECT. Caso eu queira criar uma tabela temporária eu devo colocar o "#":
SELECT 'a' AS col
INTO #teste
Fazendo com que seja criado uma tabela temporária duradoura somente até o fim da sessão.
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 12 de julho de 2018 11:14
-
-