Como criar

Tabelas Temporárias são criadas no database TempDB e podem ser classificadas em Locais e Globais:

  • Tabelas Temporárias Locais: são criadas com o prefixo "#" e possuem visibilidade restrita para a conexão responsável por sua criação; outras conexões não "enxergam" a tabela.
  • Tabelas Temporárias Globais são criadas com o prefixo "##" e são visíveis por todas as conexões

Nos dois casos, o database TempDB não deve ser referenciado como parte do nome da tabela.

Como dropar

Uma tabela temporária (Local ou Global) só existe enquanto a conexão responsável pela sua criação estiver ativa. O momento da desconexão, tabelas temporárias remanescentes serão dropadas automaticamente.

Exemplo-1:

create table #temp
( cod_cli int,
  nome_cli varchar(50)
)
insert into #temp values (1,'Livia')
select * from #temp

Exemplo 1

select ano = year(OrderDate), qtde_pedidos = count(*)
into ##temp
from northwind.dbo.orders
group by year(OrderDate

Exemplo 2

Dicas

Muitas vezes testamos repetidas vezes um batch que cria tabelas temporárias:

Server: Msg 2714, Level 16, State 6, Line 1
There is already an object named '#temp' in the database.

Erro 1

Ou

Server: Msg 208, Level 16, State 1, Line 1
Invalid object name '#temp'. 

Erro 1

... verifique se a tabela temporária existe ANTES de sua criação através da função OBJECT_ID():

if object_id('tempdb.dbo.#temp') is not null drop table #temp
create table #temp
( cod_cli int,
  nome_cli varchar(50)
)

função OBJECT_ID()

Quando utilizar tabelas temporárias em procedures, procure criar todas as tabelas temporárias num mesmo ponto. Intercalar comandos DDL (CREATE TABLE, CREATE INDEX, etc) com comandos DML (INSERT, UPDATE, SELECT, etc) é causa frequente de recompilações.

Portanto substitua:

create proc stp_recompile
as
--DDL
create table #temp1 ( cod_cli int, nome_cli varchar(50))
--DML
insert into   #temp1 values (1,'cliente-1')
--DDL
create clustered index ix_temp on #temp1 (cod_cli)
--DML
select * from #temp1
RETURN

Por

create proc stp_NOT_recompile
as
--DDL
create table  #temp1 ( cod_cli int, nome_cli varchar(50))
create clustered index ix_temp on #temp1 (cod_cli)
--DML
insert into   #temp1 values (1,'cliente-1')
select * from #temp1
RETURN

Para visualizar as recompilações do batch a seguir no profiler:

exec stp_recompile
go
exec stp_recompile
go
exec stp_NOT_recompile
go
exec stp_NOT_recompile
go

18-08pic01.JPG
Conclusão

Tabelas temporárias ajudam muito no dia-a-dia, mas devemos ter em mente que sua utilização exige gravação em disco, e gravação em disco é sinônimo de baixa performance. Muitas vezes a utilização de tabelas temporárias pode ser substituída por joins “mais bem trabalhados”.

Bem, ficamos por aqui.

Até a próxima!