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
select ano = year(OrderDate), qtde_pedidos = count(*)
into ##temp
from northwind.dbo.orders
group by year(OrderDate
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.
Ou
Server: Msg 208, Level 16, State 1, Line 1
Invalid object name '#temp'.
... 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)
)
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
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!