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!
Muito bom! =)
ResponderExcluir