Como descarto variáveis ​​de tabela no SQL-Server? Eu deveria fazer isso?


123

Eu tenho uma variável de tabela em um script (não um procedimento armazenado). Duas questões:

  1. Como eu largo a variável da tabela? Soltar tabela @varName fornece um erro "Snytax incorreto".
  2. Devo sempre fazer isso? Ouvi dizer que é uma boa prática. É realmente necessário para pequenos scripts como este?

Aqui está o meu código:

Declare @projectList table(
    name varchar(40) NOT NULL);

Insert Into @projectList
Values ('BCR-00021')

Select *
From @projectList

Drop Table @projectList -- does not work

Você não pode descartá-las, para que a segunda parte da sua pergunta não se aplique.
Martin Smith

Respostas:


189

As variáveis ​​da tabela são automaticamente locais e eliminadas automaticamente - você não precisa se preocupar com isso.


17
+1 - Você também não pode descartá-los, mesmo que queira - eles persistem enquanto a sessão estiver aberta, como qualquer outra variável. Eles também não são afetados pelas transações.
JNK

10
Os @JNKs apontam que eles não são afetados pelas transações é importante. Você pode usar variáveis ​​de tabela para armazenar dados e gravar em uma tabela de log após um erro causar uma reversão.
HLGEM

3
Não, não é a mesma coisa. As tabelas temporárias participam de transações.
Paul Perigny

Nem são os mesmos que CTEs.
Hogan

você não pode deixá-los, mas você pode excluí-los '@projectList delete';)
RK Sharma

29

Variáveis ​​de tabela são como variáveis ​​int ou varchar.

Você não precisa largá-los. Eles têm as mesmas regras de escopo que as variáveis ​​int ou varchar

O escopo de uma variável é o intervalo de instruções Transact-SQL que podem fazer referência à variável. O escopo de uma variável dura do ponto em que é declarada até o final do lote ou procedimento armazenado no qual é declarada.


1
Você sabe se os objetos tempdb criados pelas variáveis ​​da tabela são limpos quando ficam fora do escopo? Ou o servidor espera até que a sessão seja fechada antes de limpá-los?
StriplingWarrior

21

se alguém se deparar com isso ... e você realmente precisar descartá-lo como em um loop, basta excluir todos da variável de tabela:

DELETE FROM @tableVariableName

7

Mas todos vocês esqueceram de mencionar que, se uma tabela variável for usada dentro de um loop, ela precisará ser esvaziada (delete @table) antes de carregar os dados novamente dentro de um loop.


3

Assim como TempTables, uma variável de tabela local também é criada no TempDB. O escopo da variável de tabela é o lote, procedimento armazenado e bloco de instruções em que é declarado. Eles podem ser passados ​​como parâmetros entre procedimentos. Eles são descartados automaticamente quando você fecha a sessão em que os cria.


#temp table não é igual à variável @table, não cai automaticamente após o final do patch ou escopo, é descartada automaticamente apenas se for criada dentro do procedimento armazenado e o procedimento armazenado terminar a execução
Abou-Emish

1

Aqui está uma solução

Declare @tablename varchar(20)
DECLARE @SQL NVARCHAR(MAX)

SET @tablename = '_RJ_TEMPOV4'
SET @SQL = 'DROP TABLE dbo.' + QUOTENAME(@tablename) + '';

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@tablename) AND type in (N'U'))
    EXEC sp_executesql @SQL;

Funciona bem no SQL Server 2014 Christophe

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.