Due sessioni possono creare tabelle #temp con lo stesso nome?


16

Sto creando una tabella temporanea ( #myTable) e usando un cursore. Questo crea un problema quando gli utenti simultanei accedono al cursore attraverso la mia applicazione? Mi consente di creare tabelle temporanee separate con lo stesso nome?

Di seguito è riportato il codice di esempio:

Open cursor;
Fetch Next from cursor into @Variable_Temp_Table_Name;
Create table #myTable(pk int)
While @@Fetch_Status = 0
Begin    
Fetch Next from cursor into @Variable_Temp_Table_Name;
End 

Risposte:


20

Il server SQL aggiunge sempre un numero casuale alla fine del nome di una tabella temporanea (dietro le quinte), quando gli utenti simultanei creano tabelle temporanee nelle loro sessioni con lo stesso nome, il server sql creerà più tabelle temporanee nel tempdb.

Ho creato 3 tabelle temporanee chiamate #TempTablein tre diverse sessioni nel mio SSMS, ora se vado al tempdb posso vedere le tabelle temporanee create lì con una stringa casuale (unica) aggiunta al nome di ciascuna tabella temporanea.

inserisci qui la descrizione dell'immagine


11

Sì, più applicazioni otterranno le proprie copie della tabella #temp. Questo è il punto di usare una tabella #temp, perché ogni sessione simultanea ha il suo oggetto isolato. Questo non ha nulla a che fare con il fatto che tu stia usando un cursore in combinazione con la tua tabella #temp (anche se sospetto che il cursore non sia comunque necessario - non hai incluso abbastanza codice per commentare in modo specifico).

Modifica per includere il commento:

Un'altra cosa sull'uso delle tabelle #temp è che se è necessario aggiungere vincoli a esse, lasciare che il server SQL generi il nome altrimenti, anche se la tabella sarà univoca per la sessione, il vincolo non lo farà e la seconda istanza non riuscirà a creare il tavolo.


7
Un'altra cosa sull'uso delle tabelle #temp è che se è necessario aggiungere vincoli a esse, lasciare che il server SQL generi il nome altrimenti, anche se la tabella sarà univoca per la sessione, il vincolo non lo farà e la seconda istanza non riuscirà a creare il tavolo.
Aaron,

1
@Aaron: suggerisci di spostare il commento sui vincoli senza nome nella risposta. Molte persone si incasinano su quel dettaglio.
RLF,

Si noti inoltre che se qualcuno fa desiderare una tabella temporanea globale, possono dichiararla ##likeThis.
underscore_d

@RLF e Aaron: si può sempre generare un GUID con NEWID () e creare il vincolo tramite Dynamic SQL. Non dire che è pulito come includerlo nell'istruzione CREATE TABLE, ma è almeno un'opzione. E credo anche che i vincoli FK non siano consentiti sulle tabelle temporanee (purché si parli di vincoli genericamente).
Solomon Rutzky,

@srutzky - Vero, ma i vincoli con nome sono generalmente nominati in modo da facilitare il riferimento a questi dal codice. L'uso di un NEWID () non fornirà tale semplificazione, sebbene sia possibile eseguire una query per trovare il NEWID, se necessario.
RLF,
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.