sexta-feira, 14 de maio de 2010

Removendo tabelas temporárias dinâmicamente

Em algumas situações, podemos ter que criar e eventualmente destruir tabelas temporárias de maneira dinâmica. Porém uma dificuldade pode ser determinar se uma tabela temporária eventualmente existe no banco de dados ou não. Vejamos o exemplo abaixo:

select

      name

into #teste_tmpx

from

      sys.objects

 

select * from #teste_tmpx

 

As querys acima funcionam corretamente, e a primeira query realmente cria de maneira implícita a tabela #teste_tmpx. Podemos “dropar” a tabela temporária com um comando simples:

drop table #teste_tmpx

 

Mas vamos observar o seguinte exemplo:

declare @teste int

 

select @teste=count(*)

from sys.objects

where object_id = -1

 

if @teste>0

      create table #teste_tmpx(

        nome varchar(200)

      )

 

select * from #teste_tmpx

 

Observe que o exemplo acima, condiciona a criação da tabela temporária ao valor de uma variável atribuída através de um count em sys.objects. Podemos facilmente condicionar a destruição do objeto ou o acesso a ele, repetindo a query ou acessando novamente o objeto, mas e se a condição mudou de valor durante a execução do script? Temos então um risco lógico que devemos mitigar. A query abaixo, apesar de ser muito útil para objetos atemporais, não funciona para tabelas temporárias:

if exists(select 0 from sys.objects where name like '%teste_tmpx%')

begin

  drop table #teste_tmpx

  print 'dropou o objeto!'

end

 

Podemos contornar este problema, utilizando a função OBJECT_ID:

if OBJECT_ID('tempdb..#teste_tmpx')is not null

begin

  drop table #teste_tmpx

  print 'dropou o objeto!'

end

Até a próxima!

 

Um comentário:

Leave your comment here!