Capita spesso di confondere due strutture dati simili ma profondamente diverse: le tabelle temporanee e le variabili tabella.
La prima differenza evidente sta nella dichiarazione: le tabelle temporanee iniziano con il cancelletto (detto anche hash: #), le variabili tabella invece iniziano con la chiocciola (detta anche snail: @).
Inoltre le variabili tabella sono create esattamente come le tabelle fisiche:
CREATE TABLE #tmptab (campo1 int, campo2 varchar...)
Mentre le variabili tabella sono create come se fossero delle variabili scalari:
DECLARE @vartab (campo1 int, campo2 varchar...)
Indagando un po’ più a fondo, le differenze sono anche altre: le tabelle temporanee durano per tutto il tempo in cui è attiva la connessione, quindi possiamo crearle e poi usarle anche più volte, nella stessa connessione, finché non scade (per esempio perché si chiude il Management Studio) o finché non si usa un’istruzione esplicita di DROP TABLE #tmptab. Invece le variabili tabella sono usate solo durante l’esecuzione della query. In altre parole, se le popoliamo e poi le vogliamo usare di nuovo, dovremo ripopolarle ogni volta.
Per quanto riguarda gli indici, nelle tabelle temporanee è possibile creare esattamente tutti gli indici che si possono creare nelle tabelle fisiche (anche perché di fatto lo sono!), mentre in una variabile tabella è possibile creare solo una chiave primaria, che automaticamente creerà un indice cluster, ma non è possibile creare altri indici.
Dal momento che, quando si crea una tabella temporanea, SQL server crea fisicamente una tabella nel database di sistema tempdb, non è possibile creare tabelle temporanee dentro una funzione. Comunque è possibile creare una tabella temporanea in una stored procedure.
Infine, le tabelle temporanee possono anche essere rese visibili ad altre connessioni usando un doppio cancelletto durante la creazione:
CREATE TABLE #tabPrivata CREATE TABLE ##tabPubblica
In questo esempio, la tabella #tabPrivata è visibile solo all’interno della connessione corrente, mentre ##tabPubblica, detta tabella temporanea globale, è visibile da tutte le connessioni, finché non è chiusa la connessione che l’ha creata.
Un commento su “Tabella temporanea o variabile tabella?”