Czy dwie sesje mogą tworzyć tabele #temp o tej samej nazwie?

17

Tworzę tymczasową tabelę ( #myTable) i używam kursora. Czy stwarza to problem, gdy współbieżni użytkownicy uzyskują dostęp do kursora za pośrednictwem mojej aplikacji? Czy pozwala mi to tworzyć osobne tabele tymczasowe o tej samej nazwie?

Oto przykładowy kod:

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 
sujith karivelil
źródło

Odpowiedzi:

20

Serwer SQL zawsze dołącza dowolną liczbę losową na końcu nazwy tabeli tymczasowej (za kulisami), gdy współbieżni użytkownicy tworzą tabele tymczasowe w swoich sesjach o tej samej nazwie, serwer sql utworzy wiele tabel tymczasowych w tempdb.

Utworzyłem 3 tabele tymczasowe wywoływane #TempTablew trzech różnych sesjach w moim SSMS, teraz jeśli przejdę do tempdb, zobaczę utworzone tam tabele tymczasowe z losowym (unikalnym) łańcuchem dołączonym do nazwy każdej tabeli tymczasowej.

wprowadź opis zdjęcia tutaj

M.Ali
źródło
11

Tak, wiele aplikacji otrzyma własne kopie tabeli #temp. Taki jest sens korzystania z tabeli #temp, ponieważ każda równoczesna sesja ma swój własny, izolowany obiekt. Nie ma to nic wspólnego z tym, czy używasz kursora w połączeniu ze swoją tabelą #temp (choć podejrzewam, że kursor i tak nie jest potrzebny - nie dodałeś wystarczającej ilości kodu, aby skomentować).

Edytuj, aby dołączyć komentarz:

Jedną dodatkową rzeczą dotyczącą używania tabel #temp jest to, że jeśli musisz dodać do nich ograniczenia, pozwól SQL Serverowi wygenerować nazwę w przeciwnym razie, nawet jeśli tabela będzie unikalna dla sesji, ograniczenie nie będzie, a druga instancja nie będzie mogła utworzyć stół.

Aaron Bertrand
źródło
7
Jedną dodatkową rzeczą dotyczącą używania tabel #temp jest to, że jeśli musisz dodać do nich ograniczenia, pozwól SQL Serverowi wygenerować nazwę w przeciwnym razie, nawet jeśli tabela będzie unikalna dla sesji, ograniczenie nie będzie, a druga instancja nie będzie mogła utworzyć stół.
Aaron
1
@Aaron - zasugeruj przeniesienie komentarza dotyczącego nienazwanych ograniczeń do odpowiedzi. Wiele osób ma problem z tym szczegółem.
RLF,
Należy również pamiętać, że jeśli ktoś nie chce temp tabeli globalnej, mogą to zgłosić ##likeThis.
underscore_d
@RLF i Aaron: zawsze można wygenerować identyfikator GUID za pomocą NEWID () i utworzyć ograniczenie za pomocą dynamicznego SQL. Nie mówię, że jest to tak czyste, jak włączenie go do instrukcji CREATE TABLE, ale jest to przynajmniej opcja. Uważam również, że ograniczenia FK nie są dozwolone w tabelach tymczasowych (o ile mówimy o ograniczeniach ogólnie).
Solomon Rutzky
@srutzky - Prawda, ale nazwane ograniczenia są zwykle nazywane, aby ułatwić odwoływanie się do nich z kodu. Użycie NEWID () nie zapewni tego uproszczenia, chociaż w razie potrzeby możesz zapytać o znalezienie NEWID.
RLF