2011-08-16 9 views
44

Zdaję sobie sprawę, że tabele tymczasowe to sesja/połączenie powiązane i niewidoczne lub niedostępne dla sesji/połączenia.Czy istnieje sposób, aby uzyskać listę wszystkich bieżących tabel tymczasowych w SQL Server?

Mam długo działającą procedurę składowaną, która tworzy tymczasowe tabele na różnych etapach.

Czy istnieje sposób, w jaki mogę wyświetlić listę aktualnych tabel tymczasowych? Jakie przywileje są mi potrzebne, aby móc to zrobić?

Alternatywnie

Czy istnieje sposób widzę szczególności oświadczenie SQL wykonywane wewnątrz uruchomionej procedury przechowywanej? Procedura działa jako zaplanowane zadanie w programie SQL Server.

Używam SQL Server 2000.

Dzięki za praktyczne.

Odpowiedz

71

Czy to jest to, czego szukasz?

select * from tempdb..sysobjects 
--for sql-server 2000 and later versions 

select * from tempdb.sys.objects 
--for sql-server 2005 and later versions 
+0

Nie powiedzie się to w SQL Server 2000. – AAsk

+12

W 2008: tempdb.sys .objects, W 2000: tempdb..sysobjects –

+5

listuje wiele różnych obiektów w tempdb, w tym indeksy, a także globalne tabele temp. nie powinien być wybrany jako odpowiedź – FLICKER

2

Jeśli potrzebujesz "zobaczyć" listę tymczasowych tabel, możesz po prostu zarejestrować używane nazwy. (i jak inni zauważyli, możliwe jest bezpośrednie zapytanie o te informacje)

Jeśli potrzebujesz "zobaczyć" zawartość tabel tymczasowych, musisz utworzyć prawdziwe tabele z (unikalną) nazwą tymczasową.

Możesz śledzić SQL wykonywane przy użyciu programu SQL Profiler:

[Artykuły te kierować wersje SQL Server później niż 2000, ale większość porada jest taka sama.]

Jeśli masz długotrwały proces, który jest ważny dla Twojej firmy, dobrym pomysłem jest zarejestrowanie w procesie różnych kroków (nazwa kroku/numer, czas rozpoczęcia i zakończenia). W ten sposób masz linię bazową do porównania, gdy rzeczy nie działają dobrze, i możesz wskazać, które etapy powodują problem szybciej.

+0

Dzięki. Przez "log używane nazwy", czy mam rację myśląc, że masz na myśli zapisać nazwę tabeli tymczasowej (po utworzeniu) do innego stołu? – AAsk

+0

@AAsk: tak, to jedna z możliwości. Czy mogę zapytać, co właściwie próbujesz rozwiązać? Czy masz wiele tabel tymczasowych? –

+0

Mam procedurę przechowywaną uruchomioną raz w tygodniu w niedzielę o 3:00 rano, zwykle biorąc pod niecałe 2 godziny. W ostatnią niedzielę trwało to 6 godzin i nie skończyło się. Używam go ponownie bez zmian - stąd moje pytanie. Jeśli znowu się nie powiedzie, będę pisać komunikaty na kluczowych etapach do tabeli "debugowania", aby zobaczyć jej postępy. – AAsk

6

Można uzyskać listę tabel tymczasowych przez następujące zapytanie:

select left(name, charindex('_',name)-1) 
from tempdb..sysobjects 
where charindex('_',name) > 0 and 
xtype = 'u' and not object_id('tempdb..'+name) is null 
+0

Po prostu komentarz, twoja ostatnia klauzula jest o wiele bardziej czytelna, ponieważ 'i id_obiektu (...) nie jest pusta' –

+0

Zwraca również stałe tabele (które oczywiście mogą nie należeć do mojej sesji) . –

2

Dla SQL Server 2000, powinien to powiedzieć tylko tabele #temp w sesji. (Adaptacja my example for more modern versions of SQL Server here). Zakłada się, że nie wymienić tabele z trzech kolejnych podkreślenia, jak CREATE TABLE #foo___bar:

SELECT 
    name = SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1), 
    t.id 
FROM tempdb..sysobjects AS t 
WHERE t.name LIKE '#%[_][_][_]%' 
AND t.id = 
    OBJECT_ID('tempdb..' + SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1)); 
2
SELECT left(NAME, charindex('_', NAME) - 1) 
FROM tempdb..sysobjects 
WHERE NAME LIKE '#%' 
    AND NAME NOT LIKE '##%' 
    AND upper(xtype) = 'U' 
    AND NOT object_id('tempdb..' + NAME) IS NULL 

można usunąć linię ##, jeśli chcesz to globalne tabele tymczasowe.

Powiązane problemy