Come faccio a rilasciare le variabili di tabella in SQL Server? Dovrei anche fare questo?


123

Ho una variabile di tabella in uno script (non una procedura memorizzata). Due domande:

  1. Come faccio a eliminare la variabile della tabella? Drop Table @varName restituisce un errore "snytax non corretto".
  2. Dovrei farlo sempre? Ho sentito che è una buona pratica. È mai davvero necessario per piccoli script come questo?

Ecco il mio codice:

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

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

Select *
From @projectList

Drop Table @projectList -- does not work

Non puoi lasciarli da soli, quindi la seconda parte della tua domanda non si applica.
Martin Smith

Risposte:


189

Le variabili di tabella vengono automaticamente locali e rilasciate automaticamente, non devi preoccupartene.


17
+1 - Inoltre, non puoi rilasciarli anche se lo desideri - persistono finché la sessione è aperta, proprio come qualsiasi altra variabile. Inoltre non sono influenzati dalle transazioni.
JNK

10
Il punto di @JNK sul fatto che non siano influenzati dalle transazioni è importante, è possibile utilizzare le variabili di tabella per contenere i dati e scrivere in una tabella di registro dopo che un errore ha causato un rollback.
HLGEM

3
No, non è la stessa cosa. Le tabelle temporanee partecipano alle transazioni.
Paul Perigny

Né sono gli stessi dei CTE.
Hogan

non puoi rilasciarli ma puoi eliminarli 'elimina @projectList';)
RK Sharma

29

Le variabili di tabella sono come le variabili int o varchar.

Non è necessario lasciarli cadere. Hanno le stesse regole di ambito delle variabili int o varchar

L'ambito di una variabile è l'intervallo di istruzioni Transact-SQL che possono fare riferimento alla variabile. L'ambito di una variabile dura dal punto in cui viene dichiarata fino alla fine del batch o della stored procedure in cui viene dichiarata.


1
Sai se gli oggetti tempdb creati dalle variabili di tabella vengono ripuliti quando escono dall'ambito? Oppure il server attende la chiusura della sessione prima di ripulirli?
StriplingWarrior

21

se qualcun altro si imbatte in questo ... e devi davvero rilasciarlo come se fossi in un ciclo, puoi semplicemente eliminare tutto dalla variabile della tabella:

DELETE FROM @tableVariableName

7

Ma vi siete tutti dimenticati di menzionare che se una tabella di variabili viene utilizzata all'interno di un ciclo, dovrà essere svuotata (eliminare @table) prima di caricare nuovamente i dati all'interno di un ciclo.


3

Proprio come TempTables, anche una variabile di tabella locale viene creata in TempDB. L'ambito della variabile di tabella è il batch, la procedura memorizzata e il blocco di istruzioni in cui è dichiarata. Possono essere passati come parametri tra le procedure. Vengono automaticamente rilasciati quando chiudi la sessione in cui li crei.


La tabella #temp non è la stessa della variabile @table, non viene eliminata automaticamente dopo la fine della patch o dell'ambito, viene eliminata automaticamente solo se è stata creata all'interno della stored procedure e la stored procedure è terminata
Abou-Emish

1

Ecco una soluzione

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;

Funziona bene su SQL Server 2014 Christophe

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.