Jaka jest różnica między tabelą @, tabelą # i tabelą ## w SQL Server?
Jaka jest różnica między tabelą @, tabelą # i tabelą ## w SQL Server?
Odpowiedzi:
#table
odnosi się do lokalnej (widocznej tylko dla użytkownika, który ją utworzył) tabeli tymczasowej.
##table
odnosi się do globalnej (widocznej dla wszystkich użytkowników) tabeli tymczasowej.
@variableName
odnosi się do zmiennej, która może przechowywać wartości w zależności od jej typu.
#
a ##
tabele to rzeczywiste tabele reprezentowane w tymczasowej bazie danych. Tabele te mogą mieć indeksy i statystyki i można uzyskać do nich dostęp poprzez sprocs w sesji (w przypadku globalnej tabeli tymczasowej jest ona dostępna między sesjami).
@Table to zmienna tabeli.
Skupiłbym się na różnicach między #table i @table. ## table jest globalną tabelą tymczasową i przez ponad 10 lat używania SQL Server nie znalazłem jeszcze ważnego przypadku użycia. Jestem pewien, że niektóre istnieją, ale natura obiektu sprawia, że jest on wysoce bezużyteczny IMHO.
Odpowiedź na @whiner autorstwa @marc_s jest absolutnie prawdziwa: rozpowszechnionym mitem jest to, że zmienne tabeli zawsze żyją w pamięci. W rzeczywistości dość często zmienna tabeli trafia na dysk i działa podobnie jak tabela tymczasowa.
W każdym razie proponuję zapoznać się z zestawem różnic, podążając za linkami wskazanymi przez @Astander. Większość różnic dotyczy ograniczeń dotyczących tego, czego nie można zrobić ze zmiennymi @table.
CREATE TABLE #t
Tworzy tabelę, która jest widoczna tylko w czasie tego POŁĄCZENIA i podczas tego POŁĄCZENIA ten sam użytkownik, który tworzy inne połączenie, nie będzie mógł zobaczyć tabeli #t z innego połączenia.
CREATE TABLE ##t
Tworzy tymczasową tabelę widoczną dla innych połączeń. Ale tabela jest usuwana po zakończeniu tworzenia połączenia.
SqlConnection.Open()
z tymi samymi parametrami połączenia jest to samo POŁĄCZENIE ?