2008-09-26 13 views
26

Mam aplikację ASP.NET dla wielu użytkowników działającą na serwerze SQL Server i chcę, aby StoredProcA utworzyła tabelę z # używanym tempem - a nie zmienną tabeli - do wstawiania niektórych danych, a następnie do StoredProcB , StoredProcC i StoredProcD do manipulowania danymi w #temptable na reguły biznesowe.Tabele temp. Serwera SQL i zestawianie połączeń

Aplikacja internetowa używa łączenia połączeń podczas rozmowy z SQL. Czy otrzymam nowy, podlegający zwolnieniu obszar scratch dla każdego połączenia StoredProcA? A może połączenie będzie współdzielone z #zwoleniem między użytkownikami?

Odpowiedz

37

Połączenie połączeń (z dowolną nowoczesną wersją programu SQL Server) będzie wywoływać sp_reset_connection podczas ponownego użycia połączenia. Ten przechowywany proc, między innymi, drops any temporary tables, że połączenie jest właścicielem.

+0

OK, teraz to stwierdzenie ma sens do mnie: „Kiedy stół jest poprzedzony single sign«#», jest ona definiowana jako lokalnej tabeli tymczasowej i jej zakres ogranicza się do sesji, w której jest utworzony.” Słowo "sesja" mnie zaintrygowało! – marc

+0

Co powiesz na globalnie widoczne tabele tymczasowe (## tableName)? –

+0

Globalne tabele tymczasowe nie mają zasięgu, więc nie zostaną zrzucone. –

1

Aby udostępnić tabelę tymczasową między użytkownikami, należy użyć dwóch skrótów przed nazwą ## like_this.

W tym przypadku należy jednak podjąć kroki, aby uniknąć konfliktów z wieloma wystąpieniami programu.

6

Tabela ## zostanie udostępniona wszystkim użytkownikom. Zakładam, że to nie jest twoja intencja.

Jedna tabela z tempem # jest widoczna dla wszystkich procedur przechowywanych w stosie wywołań, ale nie jest widoczna poza tym zakresem. Jeśli możesz mieć wywołanie procedury B, C i D, powinieneś być w porządku.

Edytuj: Procedura zgłaszania, nad którą teraz pracuję, jest bardzo podobna. :) Tworzę tabelę tymczasową (#results) w proccie głównym, który jest wywoływany przez aplikację, następnie wykonuję kilka skomplikowanych danych w serii procedur potomnych, 1) abstrakcyjny powtarzany kod i 2) utrzymuję procedurę root'a do ponad 500 linii.

+0

Tak, dokładnie tak. Dzięki! – marc

+0

Great S.O. pytanie przy okazji; pytanie, które każdy zadaje w pewnym momencie.Założę się, że będzie to jedno z pytań, które napędza ruch w Google tutaj, a któregoś dnia będzie co najmniej srebrna. –

2

#temptable nie przeżyje po zakończeniu procedury, w której została zadeklarowana, więc nigdy nie będzie widoczna dla innych użytkowników.

Edit: Heh, okazuje się, że „zagnieżdżanie widoczność” tabel tymczasowych pracowała od SQL Server 7.0, ale nigdy aktualizowane któregokolwiek z mojego kodu, aby skorzystać z tego. Chyba się spotykam - wielu ludzi prawdopodobnie nie może sobie wyobrazić, że to był SQL Server w 6,0 i 6,5 dniach ...

+1

#demptable ma zakres połączenia, a nie zakres procedury. –

+1

Obawiam się, że się mylicie. –

+0

A tu przytoczyć na to: http://decipherinfosys.wordpress.com/2007/05/04/temporary-tables-ms-sql-server/ –

0

Stoły Temp zostały utworzone z manglingiem nazwy pod maską więc nie powinno konflikt między różnymi wywołaniami procedur przechowywanych.

Jeśli zachodzi potrzeba manipulowania tymi samymi danymi tymczasowymi w kolejnych wywołaniach procedur przechowywanych, najlepiej jest po prostu przejść do rzeczywistej tabeli i użyć unikalnego identyfikatora, aby upewnić się, że dane dotyczą tylko istotnych danych. Jeśli dane są tylko tymczasowo wartościowe, usuń je ręcznie, gdy skończysz.

2

Od docs MS:

http://msdn.microsoft.com/en-us/library/ms177399(SQL.90).aspx

tabel tymczasowych

tabele tymczasowe są podobne do stałych stołów, z wyjątkiem tabel tymczasowych są przechowywane w tempdb i są usuwane automatycznie po nie są już używane.

Istnieją dwa rodzaje tabel tymczasowych: lokalne i globalne. Różnią się one od siebie nazwami, widocznością i dostępnością.Lokalne tabele tymczasowe mają jeden znak liczby (#) jako pierwszy znak ich nazw; są widoczne tylko dla bieżącego połączenia dla użytkownika i są usuwane, gdy użytkownik rozłącza się z wystąpieniem SQL Server.

globalne tabele tymczasowe mają dwa znaki numer (##) jako pierwszy bohaterów ich nazwy; są one widoczne dla każdego użytkownika po jego utworzeniu i są usuwane, gdy wszyscy użytkownicy odwołujący się do tabeli odłączają się od wystąpienia SQL Server.

Na przykład, jeśli tworzysz pracowników tabeli, tabela może być wykorzystywany przez każdą osobę, która ma uprawnienia zabezpieczeń w bazie danych, aby go używać, dopóki tabela zostanie usunięty. Jeśli sesja bazy danych utworzy lokalną tabelę tymczasową # pracownicy, tylko sesja może działać z tabelą i jest usuwana po rozłączeniu sesji. Jeśli utworzysz pracowników ### globalnej tabeli, każdy użytkownik w bazie danych może pracować z tą tabelą. Jeśli żaden inny użytkownik nie pracuje z tą tabelą po jej utworzeniu, tabela jest usuwana po rozłączeniu. Jeśli inny użytkownik pracuje z tabelą po jej utworzeniu, SQL Server usuwa ją po rozłączeniu i po tym, jak wszystkie inne sesje nie będą już jej aktywnie używać.

Dodatkowo od Curt którzy Poprawiono błąd z moich sposobów, a tylko w przypadku pominięcia cytat w komentarzu:

http://msdn.microsoft.com/en-us/library/ms191132.aspx

  • Jeśli utworzyć lokalną tymczasowy tabeli Wewnątrz procedura składowana, tabela tymczasowa istnieje tylko dla celów procedury składowanej; po zamknięciu zapisanej procedury znika ona.

  • Jeśli wykonać procedurę przechowywaną który wywołuje inną procedurę przechowywaną, wywoływana procedura składowana może dostęp wszystkie obiekty utworzone przez pierwszej procedury przechowywanej, w tym tabel tymczasowych.

+1

Powiedział specjalnie, że używa procedur przechowywanych. To, co mówisz, jest prawdą, jeśli tabela temp znajduje się na "najwyższym poziomie" połączenia, ale gdy jest używana w procedurze przechowywanej, jest automatycznie usuwana na końcu. Poszukam cytatu w oficjalnych dokumentach. –

+1

„W przypadku utworzenia lokalnej tabeli tymczasowej wewnątrz procedury przechowywanej, tabela tymczasowa istnieje tylko dla celów procedury przechowywanej, ale znika po wyjściu z procedury przechowywanej.” @ Http://msdn.microsoft.com/en-us/library/ms191132.aspx –

+0

Hi Curt - punkt podjęte i zrozumiałe i przeprosiny :) – Kev

1

znajdę wzajemne oddziaływanie badanych tabele tymczasowe/sesji/połączeń/zestawianie połączeń dość kłopotliwe ... :( Mark, Twój rachunek jest jednym z najczystszych, że znalazłem robić dużo i Google badania MSDN. Mimo to, chciałbym poznać źródło wyciągu.

i może ktoś proszę wyjaśnić różnicę między sesji i podłączenia do mnie? nie mogłem znaleźć żadnych twardych faktów o tym.

wydaje być również problemem w terminologii, myślę: jeśli "zamkniesz" połączenie może zostać zwolniony do puli połączeń, więc połączenie pozostaje (przez jakiś czas) otwarte ... arghs ... Jak odróżnić ten jeden smak blisko i inny smak blisko ?!