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
jtpereyda
fonte
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.

Hogan
fonte
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.

gbn
fonte
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
Leo Much
fonte
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.

Peppe
fonte
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.

Gagan
fonte
#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

CSonneck
fonte