Variáveis tipo Table
Definição
Variável tipo TABLE nada mais é do que um tipo especial de variável que pode ser utilizada para armazenamento temporário de dados, de maneira similar a tabelas temporárias.
Vantagens
· Devido à sua utilização estritamente local, tabelas criadas a partir de variáveis tipo TABLE não consomem recursos para controle de bloqueios;
· A manipulação de dados em variáveis tipo TABLE é mais eficiente porque essas operações são minimamente logadas (um ROLLBACK após um INSERT não tem efeito em variáveis tipo TABLE);
· Em função do seu escopo local, procedures que se utilizam de variáveis tipo TABLE estão sujeitas a um número menor de recompilações quando comparadas às tabelas temporárias.
Desvantagens
· A vida útil de uma tabela criada a partir de uma variável tipo TABLE está limitada ao batch e/ou procedure onde é utilizada;
· Com variáveis tipo TABLE não é permitido:
§ Criação de índices não-cluster,
§ Criação de constraints CHECK, DEFAULT;
§ Criação e/ou atualização de estatísticas;
§ Alteração da estrutura da tabela;
§ Uma variável tipo TABLE não pode ser o destino de INSERT EXEC ou SELECT
INTO
§ Uma variável tipo TABLE só pode ser referenciada por um comando
SP_EXECUTESQL se a variável for criada.
Utilização
Variáveis tipo TABLE são uma ótima opção para armazenamento transitório de dados, em substituição às tabelas temporárias. Exemplos de utilização:
· Para criar uma variável tipo TABLE
declare @tab TABLE (cod_cliente int, qtde_pedidos int)
· Manipulando dados numa variável tipo tabela
declare @tab TABLE (cliente varchar(10), qtde_pedidos int)
insert into @tab
select customerId, qtde_pedidos=count(*)
from orders
where customerId like ('v%')
group by customerId
select * from @tab
update @tab set qtde_pedidos = qtde_pedidos + 1
delete from @tab
---------------------------------------------------------------------
(3 row(s) affected)
cliente qtde_pedidos
---------- ------------
VAFFE 11
VICTE 10
VINET 5
(3 row(s) affected)
(3 row(s) affected)
(3 row(s) affected)
· Executando Join com tabela criada à partir de uma variável tipo TABLE
declare @tab TABLE (cliente varchar(10), qtde_pedidos int)
insert into @tab
select customerId, qtde_pedidos=count(*)
from orders
where customerId like ('v%')
group by customerId
select *
from @tab t
inner join
customers c
on t.cliente = c.customerId
---------------------------------------------------------------------
(3 row(s) affected)
cliente razao_social
---------- ----------------------------------------
VAFFE Vaffeljernet
VICTE Victuailles en stock
VINET Vins et alcools Chevalier
(3 row(s) affected)
Considerações Finais
Diferentemente do que muitos pensam, variáveis tipo TABLE também consomem recursos do TempDB – na verdade tanto tabelas temporárias quanto variáveis tipo TABLE serão criadas em memória para pequeno volume de dados. O diferencial das tabelas temporárias é o log reduzido, o número baixo de recompilações e o ganho de performance com a ausência do controle de bloqueios.
Conclusão
Variáveis tipo TABLE são uma versão “light” das equivalentes tabelas temporárias e devem ser utilizadas no dia-a-dia para armazenamento temporário de pequenos volumes de dados.
Ficamos por aqui. Até a próxima!