Array
(
)

Criar Tabela Temporária com resultado de Exec

Riechelmann
   - 24 mar 2015

Bom Dia
No sql server para criar uma tabela temporária dentro do meu conhecimento podemos
#Código

create table #TempTabela (
           Teste numeric(15,0)
)

ou
#Código
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
#Código
declare @comando varchar(max)
set @comando = 'select * from tabelaTeste'

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

Marcos P
   - 24 mar 2015

Coloque tudo dentro de @comando...

#Código

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

Riechelmann
   - 24 mar 2015


Citação:
Coloque tudo dentro de @comando...

#Código

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.

Riechelmann
   - 24 mar 2015


Citação:
Coloque tudo dentro de @comando...

#Código

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.

Riechelmann
   - 24 mar 2015

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.

#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

Marcos P
   - 24 mar 2015

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 :

#Código

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

declare @comando varchar(max)

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

Marcos P
   - 24 mar 2015

ops...

#Código

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

Marcos P
   - 24 mar 2015

na verdade...

#Código

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

Riechelmann
   - 24 mar 2015


Citação:
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 :

#Código

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
#Código
select *
  from teste

ou
#Código
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.

Marcos P
   - 24 mar 2015

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

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