Tabelle di SQL Server: qual è la differenza tra @, # e ##?


89

In SQL Server, qual è la differenza tra una tabella @, una tabella # e una tabella ##?

Risposte:


114

#table si riferisce a una tabella temporanea locale (visibile solo all'utente che l'ha creata).

##table si riferisce a una tabella temporanea globale (visibile a tutti gli utenti).

@variableName si riferisce a una variabile che può contenere valori a seconda del tipo.


29
La tua definizione di #table non è del tutto corretta. Non è limitato all'utente ma piuttosto alla connessione. Se un utente ha più connessioni, sarà visibile solo alla connessione che ha creato la #table in primo luogo.
Davin Studer

@DavinStuder ha offerto un chiarimento cruciale. La distinzione tra una tabella visibile all'utente e una tabella visibile solo sulla connessione corrente è molto importante.
mirzmaster

@DavinStuder come visualizzare più connessioni per l'utente? la stessa stringa di connessione?
Kiquenet

25

4
Mi rendo conto che questo è da molto tempo fa, ma poiché questa è una risposta solo link (e il primo link è morto), potrebbe essere aggiornato con i principali takeaway di ciascuno dei link?
Mike Guthrie

7

#e le ##tabelle sono tabelle effettive rappresentate nel database temporaneo. Queste tabelle possono avere indici e statistiche ed è possibile accedervi attraverso sproc in una sessione (nel caso di una tabella temporanea globale, è disponibile tra le sessioni).

@Table è una variabile di tabella.

Per ulteriori informazioni : http://www.sqlteam.com/article/temporary-tables


4
E la variabile di tabella risiederà anche nel database tempDB, se la sua dimensione è troppo grande per essere contenuta in memoria.
marc_s

6

Mi concentrerei sulle differenze tra #table e @table. ## table è una tabella temporanea globale e per la cronaca in oltre 10 anni di utilizzo di SQL Server devo ancora imbattermi in un caso d'uso valido. Sono sicuro che alcuni esistono ma la natura dell'oggetto lo rende altamente inutilizzabile IMHO.

La risposta a @whiner di @marc_s è assolutamente vera: è un mito prevalente che le variabili della tabella vivano sempre nella memoria. In realtà è abbastanza comune che una variabile di tabella vada su disco e funzioni proprio come una tabella temporanea.

Comunque suggerisco di leggere l'insieme delle differenze seguendo i link segnalati da @Astander. La maggior parte della differenza implica limitazioni su ciò che non puoi fare con le variabili @table.


Ho 5 stored procedure separate che eseguono parti diverse di un calcolo e producono un singolo risultato. Per l'auditing voglio vedere valori intermedi e così fa l'auditor. Ho modificato le mie procedure per scaricarne alcune su una tabella ## Temp in modo che possiamo visualizzarle entrambe ma non vengono mantenute (sono necessarie solo durante gli audit). C'è un caso d'uso valido per te (IMHO!).
RyanfaeScotland

@ Ryan perché la tabella ## è valida quando avresti potuto usare dbo.Table? Non lo considero un caso d'uso valido quando tutto ciò che hai fatto è stato evitato di digitare un'istruzione DROP.
Aaron Bertrand

4
Non voglio dare all'auditor le autorizzazioni DROP sul mio DB. Inoltre, non voglio dover tornare e rimettere in ordine dopo che ha finito. Con una tabella temporanea può eseguire la query tutte le volte che vuole e so che quando ha finito non sta lasciando un'impronta nel DB.
RyanfaeScotland

4
CREATE TABLE #t

Crea una tabella che è visibile solo su e durante quella CONNESSIONE lo stesso utente che crea un'altra connessione non sarà in grado di vedere la tabella #t dall'altra connessione.

CREATE TABLE ##t

Crea una tabella temporanea visibile ad altre connessioni. Ma la tabella viene eliminata al termine della connessione di creazione.


SqlConnection.Open()con la stessa stringa di connessione è la stessa CONNESSIONE ?
Kiquenet

2
no, è una connessione allo stesso database, ma quasi certamente non è la stessa connessione.
Markus

0

se hai bisogno di una tabella temporanea globale univoca, creane una tua con un prefisso / suffisso Uniqueidentifier e interrompi l'esecuzione post se un if object_id (.... L'unico inconveniente è l'utilizzo di Dynamic sql e devi eliminare esplicitamente.

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.