2009-05-21 22 views
46

Ho letto sull'argomento delle tabelle e degli obiettivi temporanei e tutte le risposte che ho visto non sembrano parlare di una delle mie preoccupazioni.SQL Server 2005 e ambito tabella temporaneo

Comprendo che l'ambito di una tabella temporanea locale è valido solo per la durata di una stored procedure o di stored procedure secondarie. Tuttavia qual è la situazione in merito alla concurenza. cioè se ho una procedura memorizzata che crea una tabella temporanea che viene chiamata da due processi diversi ma dalla stessa stringa utente/connessione, sarà quella tabella temporanea essere condivisa tra le due chiamate a quella stored procedure o sarà un caso di ogni chiamata alla stored procedure crea un'istanza di tabella temporanea univoca.

Suppongo che la tabella temporanea appartenga allo scopo della chiamata al procdure memorizzato ma voglio essere sicuro prima di andare in un percorso con questo.

risposta

76

Le tabelle locali temporanee (iniziano con #) sono limitate alla sessione; altre sessioni, anche dalla stessa stringa utente/connessione, non possono vederle. Le regole per la durata dipendono dal fatto che la tabella temporanea locale sia stata creata in una stored procedure:

  • Una tabella locale temporanea creata in una stored procedure viene interrotta al termine della procedura; altre stored procedure o il processo chiamante non possono vederle.
  • Altre tabelle temporanee locali vengono eliminate quando termina la sessione.

Le tabelle temporanee globali (che iniziano con ##) sono condivise tra le sessioni. Essi vengono eliminati quando:

  • La sessione che li ha creati finisce
  • e nessun altra sessione si riferisce al loro

Questo comando può essere utile per vedere che esistono tabelle temporanee:

select TABLE_NAME from tempdb.information_schema.tables 

E questo è utile per eliminare tabelle temporanee se non siete sicuri che esistano:

if object_id('tempdb..#SoTest') is not null drop table #SoTest 

Vedere questo MSDN article per ulteriori informazioni.

+0

+1 Questa è una risposta fantastica. Puoi per favore confermare questo? Se una stored procedure viene eseguita più volte dalla stessa stringa di connessione, la seconda istruzione 'if object_id ...' determina l'esistenza di una tabella temporanea nella sessione da cui viene chiamata. La mia comprensione è corretta? Capisco che le sessioni non conosceranno l'esistenza delle tabelle temporanee, ma mi chiedo solo se 'object_id' restituisce il valore basato su una sessione. – Legend

+0

@Legend: 'object_id' dovrebbe vedere solo tabelle temporanee dalla propria sessione. Dovrebbe essere facile da testare. – Andomar

+0

+1 Sì, l'ho appena controllato anch'io. Apprezzo davvero la tua risposta. Grazie. – Legend

11

La tabella temporanea sarà accessibile per l'istanza della procedura che crea

Il seguente script

Exec ('Select 1 as col Into #Temp Select * From #Temp') 
Exec ('Select 2 as col Into #Temp Select * From #Temp') 

Returns

Col 
1 

Col 
2 

Non

Col 
1 
2 

Oppure un errore perché la tabella esiste già.

La tabella temporanea sarà accessibile anche da eventuali procedure "secondarie" eseguite anche dalla procedura iniziale.

+4

+1 Punto buono, Exec() avvia un ambito interno. Le tabelle temporanee create all'interno di exec() non sono visibili al genitore. Le tabelle temporanee del genitore sono visibili al bambino, ma se il bambino crea una tabella temporanea con lo stesso nome, creerà una nuova tabella. – Andomar

+0

Proofed! Brillante! – Kuyenda

1

Si potrebbe anche pensare di utilizzare le variabili di tabella. Hanno un ambito ben definito e talvolta sono più veloci delle loro controparti temporanee. L'unico problema con le variabili di tabella è che non possono essere indicizzati, quindi alcune prestazioni potrebbero essere perse nonostante la loro natura. Check here per ulteriori informazioni sull'argomento.

+0

La grande differenza tra variabili di tabella e tabelle temporanee è che non è possibile ALTER TABLE una variabile di tabella. Tuttavia, ALTER TABLE può essere una tabella temporanea. – Kuyenda

+0

Le variabili di tabella sono buone, ma di solito se non hai intenzione di memorizzare un sacco di informazioni al loro interno. Generalmente cerco di usare le CTE e quando non posso, userò una tabella temporanea con un indice. – DataGirl

Problemi correlati