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

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

#table riferisce ad una tabella temporanea locale (visibile solo all’utente che l’ha creata).

##table fa riferimento a una tabella temporanea globale (visibile a tutti gli utenti).

@variableName fa riferimento a una variabile che può contenere valori in base al suo tipo.

Saluti

Dai un’occhiata a

  • Tabelle temporanee rispetto alle variabili di tabella e loro effetto sulle prestazioni di SQL Server
  • Differenze tra le tabelle temporanee di SQL Server e le variabili di tabella
  • Tabelle temporali e variabili di tabella: quando utilizzare cosa e perché

# tabelle # e ## sono tabelle effettive rappresentate nel database temporaneo. Queste tabelle possono avere indici e statistiche e possono essere consultate attraverso sprocs in una sessione (nel caso di una tabella temporanea globale, è disponibile attraverso le sessioni).

@Table è una variabile di tabella.

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

Mi concentrerei sulle differenze tra #table e @table. ## table è una tabella temporanea globale e per il record in oltre 10 anni di utilizzo di SQL Server non ho ancora trovato un caso di utilizzo valido. Sono sicuro che alcuni esistono ma la natura dell’object rende IMHO altamente inutilizzabile.

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

Ad ogni modo suggerisco di leggere sul set delle differenze seguendo i link indicati da @Astander. La maggior parte della differenza riguarda limitazioni su ciò che non puoi fare con le variabili @table.

 CREATE TABLE #t 

Crea una tabella visibile solo durante e durante tale CONNECTION 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 rilasciata quando viene terminata la connessione di creazione.

se hai bisogno di una tabella temporanea globale univoca, creala con un prefisso / suffisso Uniqueidentifier e rilascia l’esecuzione del post se if id_object (…. L’unico svantaggio è l’utilizzo di SQL dinamico e la necessità di abbandonare esplicitamente.