Criar Tabela Temporária com resultado de Exec

24/03/2015

0

Bom Dia

No sql server para criar uma tabela temporária dentro do meu conhecimento podemos
create table #TempTabela (
           Teste numeric(15,0)
)

ou
select teste
    into #TempTabela 
  from tabelaTeste


o que preciso saber se é possível criar uma tabela temporária vindo o conteúdo de um comando execute no sql server exemplo
declare @comando varchar(max)
set @comando = 'select * from tabelaTeste'

-- Aqui preciso criar a temporária
execute(@comando)
Lucas Ramos

Lucas Ramos

Responder

Posts

24/03/2015

Marcos P

Coloque tudo dentro de @comando...

declare @comando varchar(max)
set @comando = 
'select teste
    into #TempTabela
  from tabelaTeste
select * from #TempTabela'
 
execute(@comando)
Responder

24/03/2015

Lucas Ramos

Coloque tudo dentro de @comando...

declare @comando varchar(max)
set @comando = 
'select teste
    into #TempTabela
  from tabelaTeste
select * from #TempTabela'
 
execute(@comando)


Boa Tarde Marcus

Obrigado pela atenção, mas o into dentro do comando não é possível, porque vai variar muito a query, vai vir no comando N tipos de consultas não tendo como ter um parâmetro para eu inserir isso no comando, essas consultas são utilizadas no ERP da empresa e não tenho como deixar o Into com a declaração da temporária.
Responder

24/03/2015

Lucas Ramos

Coloque tudo dentro de @comando...

declare @comando varchar(max)
set @comando = 
'select teste
    into #TempTabela
  from tabelaTeste
select * from #TempTabela'
 
execute(@comando)


Boa Tarde Marcus

Obrigado pela atenção, mas o into dentro do comando não é possível, porque vai variar muito a query, vai vir no comando N tipos de consultas não tendo como ter um parâmetro para eu inserir isso no comando, essas consultas são utilizadas no ERP da empresa e não tenho como deixar o Into com a declaração da temporária.
Responder

24/03/2015

Lucas Ramos

Consegui resolver de outra maneira, o que eu precisava era gerar um Html Table dinamicamente por sql vindo resultado de uma consulta, segue o código que fiz, ainda vou fazer algumas melhorias no código.

DECLARE @PCONSULTA VARCHAR(100)
DECLARE @PTITULO VARCHAR(100)

SET @PCONSULTA = 'NOME_DA_CONSUTLA'
SET @PTITULO = 'TITULO da CONSULTA'

DECLARE @COMANDO VARCHAR(MAX)

SELECT @COMANDO = SQL
  FROM BANCO_DE_DADOS..CONSULTAS
 WHERE CONSULTA = @PCONSULTA

if object_id('TempDb..#ParametrosConsultas') is not null
   drop table #ParametrosConsultas

SELECT PARAMETRO
  into #ParametrosConsultas
  FROM BANCO_DE_DADOS..CONSULTAS_PARAMS
WHERE CONSULTA = @PCONSULTA

DECLARE @PARAMETRO VARCHAR(100)

WHILE EXISTS(SELECT TOP 1 * FROM #PARAMETROSCONSULTAS)
BEGIN
     SET @PARAMETRO = (SELECT TOP 1 PARAMETRO FROM #PARAMETROSCONSULTAS)
	 DELETE FROM #PARAMETROSCONSULTAS WHERE PARAMETRO = @PARAMETRO
	 SET @COMANDO = REPLACE(@COMANDO,':' + @PARAMETRO, 'NULL')
END

if object_id('TempDb..#ParametrosConsultas') is not null
   drop table #ParametrosConsultas

DECLARE @TITULO VARCHAR(MAX) 
SET @TITULO = ''

SELECT @TITULO = @TITULO + '<th>' + CAMPO + '</th>'
  FROM BANCO_DE_DADOS..CONSULTAS_CAMPOS WITH(NOLOCK)
 WHERE CONSULTA =  @PCONSULTA
  ORDER BY ORDEM

SET @TITULO = '<tr>' + @TITULO + '</tr>'

DECLARE @HTML VARCHAR(MAX) 

SET @HTML = '<html><body><H3>' + @PTITULO + '</H3> <table border = 1>'

/* Criar tabela temporária Início */
if object_id('TempDb..##TempConsHtmlFuncao') is not null
   drop table ##TempConsHtmlFuncao

DECLARE @TABELA    VARCHAR(MAX)
DECLARE @CAMPOS    VARCHAR(MAX)
DECLARE @MIN_ORDEM INT
DECLARE @MAX_ORDEM INT

SET @CAMPOS = ''

SELECT @MIN_ORDEM = MIN(ORDEM),
       @MAX_ORDEM = MAX(ORDEM) 
  FROM BANCO_DE_DADOS..CONSULTAS_CAMPOS
 WHERE CONSULTA =  @PCONSULTA
 
SET @TABELA = 'CREATE TABLE ##TempConsHtmlFuncao ('

SELECT @CAMPOS = @CAMPOS + 
                 CASE WHEN ORDEM = @MIN_ORDEM 
                      THEN '  ' 
                      ELSE ', ' 
                 END + CAMPO + ' varchar(max) '
  FROM BANCO_DE_DADOS..CONSULTAS_CAMPOS
 WHERE CONSULTA =  @PCONSULTA
  ORDER BY ORDEM

SET @TABELA = @TABELA + @CAMPOS + ')'

EXEC (@TABELA)
/* Criar tabela temporária Fim */

insert into ##TempConsHtmlFuncao
exec(@comando)

/* Preenchendo o Xml Inicio*/
DECLARE @xml NVARCHAR(MAX)

SET @XML = ''

SET @CAMPOS = ''
SELECT @CAMPOS = @CAMPOS + 
                 CASE WHEN ORDEM = @MIN_ORDEM 
                      THEN '  ' 
                      ELSE ', ' 
                 END + CAMPO + CASE WHEN ORDEM = @MAX_ORDEM
				                    THEN ' AS ''td'''
									ELSE ' AS ''td'','''''
							   END
  FROM BANCO_DE_DADOS..CONSULTAS_CAMPOS
 WHERE CONSULTA =  @PCONSULTA
  ORDER BY ORDEM

SET @CAMPOS = 'select CAST(( select ' + @campos + ' from ##TempConsHtmlFuncao FOR XML PATH(''tr''), ELEMENTS ) AS NVARCHAR(MAX)) as conteudo'

if object_id('TempDb..#TempConteudo') is not null
   drop table #TempConteudo

create table #TempConteudo(
       conteudo NVarchar(max))

insert into #TempConteudo (conteudo)
exec(@CAMPOS)

select @Xml = conteudo
  from #TempConteudo
/* Preenchendo o Xml Fim*/

SET @HTML = @HTML + @XML + '</table></body></html>'

select @HTML
Responder

24/03/2015

Marcos P

Conhecendo previamente o nome da temporária a ser gerada, você poderia concatenar o nome através de uma string na própria estrutura inicial.

Algo como :

declare @NomeTemp varchar(50)
set @NomeTemp = '#TempTabela' 

declare @comando varchar(max)

set @comando =
'select teste
    into ' + @NomeTemp
  from tabelaTeste
select * from #TempTabela'
  
execute(@comando)
Responder

24/03/2015

Marcos P

ops...

declare @NomeTemp varchar(50)
set @NomeTemp = '#TempTabela'
 
declare @comando varchar(max)
 
set @comando =
'select teste
    into ' + @NomeTemp +
  'from tabelaTeste
select * from #TempTabela'
   
execute(@comando)
Responder

24/03/2015

Marcos P

na verdade...

declare @NomeTemp varchar(50)
set @NomeTemp = '#TempTabela'
 
declare @comando varchar(max)
 
set @comando =
'select teste
    into ' + @NomeTemp +
  'from tabelaTeste
select * from ' + @NomeTemp
   
execute(@comando)
Responder

24/03/2015

Lucas Ramos

Conhecendo previamente o nome da temporária a ser gerada, você poderia concatenar o nome através de uma string na própria estrutura inicial.

Algo como :

declare @NomeTemp varchar(50)
set @NomeTemp = '#TempTabela' 

declare @comando varchar(max)

set @comando =
'select teste
    into ' + @NomeTemp
  from tabelaTeste
select * from #TempTabela'
  
execute(@comando)


Marcus, até que conseguiria fazer isso se as consultas fosse simples

mas as consultas que vão vir teoricamente não tenho o conhecimento do formato pode ser uma consulta simples ou complexa, eu vou pegar ela armazenada em um campo em uma tabela no banco de dados, pode ser
select *
  from teste

ou
select x.teste
  from (
           select *
              from teste2

           union all

           select *
             from teste3
)


Como podem ter consultas mais complexas, porém elas retornam no final com um select só trazendo o resultado e não inserem em nenhuma temporária, e não tendo uma estrutura padrão não tem como eu inserir para as mesmas colocar o resultado em uma temporária, eu consegui achar uma solução conforme mencionei antes no Post que já atende o que eu preciso, só vou organizar e otimizar o código, mas obrigado pela atenção.
Responder

24/03/2015

Marcos P

Entendi, pela sua pergunta inicial, que a estrutura era mais simples...

Se a solução que você encontrou resolve o problema... ótimo !
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar