2013-09-04 6 views
30

Napisałem procedurę przechowywaną, aby zaimportować i przekształcić dane z jednej bazy danych na inną. Każdy import miałby mieć pojedynczy identyfikator firmy i importować wszystkie dane związane z tą firmą.Zakres tabel tymczasowych w SQL Server

Aby pomóc przy transformacji, korzystam z tabel tymczasowych. W ramach przeglądu skryptu powiedziano mi, aby używać zmiennych tabelowych zamiast tabel tymczasowych. Recenzent twierdzi, że jeśli uruchomimy dwa różne importy w tym samym czasie, tabela tymczasowa zostanie udostępniona i uszkodzi import.


Pytania:

  • Czy to prawda, że ​​tabela tymczasowa byłyby dzielone jeśli prowadzimy dwa różne importu w tym samym czasie?
  • Czy każde połączenie z numerem EXEC tworzy nowy zakres?

Oto zmyślony przykład skryptu.

CREATE PROC [dbo].[ImportCompany] 
(
    @CompanyId AS INTEGER 
) 
AS 
EXEC [dbo].[ImportAddress] @CompanyId = @CompanyId 
--Import other data 

CREATE PROC [dbo].[ImportAddress] 
(
    @CompanyId AS INTEGER 
) 
AS 
    CREATE TABLE #Companies (OldAddress NVARCHAR(128), NewAddress NVARCHAR(128)) 
    INSERT INTO #Companies(OldAddress, NewAddress) 
    SELECT 
     Address as OldAddress, 
     'Transformed ' + Address as NewAddress 
    FROM 
     [OldDb].[dbo].[Addresses] 
    WHERE 
     CompanyId = @CompanyId 

    --Do stuff with the transformed data 

    DROP TABLE #Companies 

EXEC [dbo].[ImportCompany] @CompanyId = 12345 

Odpowiedz

42

Od CREATE TABLE:

lokalne tabel tymczasowych są widoczne tylko w bieżącej sesji

i (co ważniejsze):

Jeśli lokalny tabeli tymczasowej jest tworzony w procedura składowana lub aplikacja, która może być wykonywana w tym samym czasie przez wielu użytkowników, Aparat baz danych musi być w stanie rozróżnić tabele utworzone przez różnych użytkowników . Aparat baz danych robi to, wewnętrznie dołączając sufiks numeryczny do każdej lokalnej nazwy tabeli tymczasowej.

Co dokładnie odrzuca punkt tego, kto powiedział, że zostaną udostępnione.


Ponadto, nie ma potrzeby DROP TABLE pod koniec zabiegu (z tego samego łącza ponownie):

Lokalnej tabeli tymczasowej utworzone w procedurze przechowywanej jest porzucane automatycznie, gdy procedura przechowywana jest zakończone

+1

zdanie może być wykonane jednocześnie przez kilku użytkowników, Aparat baz danych musi móc odróżnić tabele utworzone przez różnych użytkowników_ jest mylące! Wygląda na to, że * ten sam użytkownik * w różnych sesjach udostępnia tabelę tymczasową. I nie jest tak. – Alex

+0

@Alex - Zgadzam się, że może to być nieco mylące, ale niestety tak właśnie Microsoft zdecydował się sformułować. –

16

Jedna sesja nie może wyświetlić tabel tymczasowych innej sesji. Tak więc różne importowanie nie wpłynie na siebie nawzajem, niezależnie od tego, czy używasz tabel tymczasowych czy zmiennych tabelarycznych.

Wyjątkiem są globalne tabele tymczasowe, które rozpoczynają się od ##. Są widoczne dla wszystkich połączeń.

20

## jest używany do globalnych tabel tymczasowych - będzie dostępny dla różnych importów.

# jest używany do lokalnych tabel tymczasowych i dostępny tylko w bieżącym/wewnętrznym zasięgu.

+2

Lokalne tabele tymczasowe są również widoczne w wewnętrznych zakresach, na przykład: http://sqlfiddle.com/#!6/d41d8/6725/1 – Andomar