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.