Есть ли способ получить список всех текущих временных таблиц в SQL Server? - PullRequest
58 голосов
/ 16 августа 2011

Я понимаю, что временные таблицы связаны с сеансом / соединением и не видны или недоступны из сеанса / соединения.

У меня есть длительная хранимая процедура, которая создает временные таблицы на разных этапах.

Есть ли способ увидеть список текущих временных таблиц?Какие привилегии мне нужны для этого?

В качестве альтернативы,

Есть ли способ увидеть, как конкретный оператор SQL выполняется внутри запущенной хранимой процедуры?Процедура выполняется как запланированное задание в SQL Server.

Я использую SQL Server 2000.

Спасибо за ваше руководство.

Ответы [ 5 ]

92 голосов
/ 16 августа 2011

Это то, что вы ищете?

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

select * from tempdb.sys.objects
--for sql-server 2005 and later versions
8 голосов
/ 16 августа 2011

Вы можете получить список временных таблиц по следующему запросу:

select left(name, charindex('_',name)-1) 
from tempdb..sysobjects
where charindex('_',name) > 0 and
xtype = 'u' and not object_id('tempdb..'+name) is null
2 голосов
/ 23 сентября 2015
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

вы можете удалить строку ##, если хотите включить глобальные временные таблицы.

2 голосов
/ 24 июля 2012

Для SQL Server 2000 это должно указывать только таблицы #temp в вашем сеансе. (Адаптировано из моего примера для более современных версий SQL Server здесь .) Это предполагает, что вы не называете свои таблицы тремя последовательными подчеркиваниями, например 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 голосов
/ 16 августа 2011

Если вам нужно «увидеть» список временных таблиц, вы можете просто записать используемые имена.(и, как отметили другие, можно напрямую запросить эту информацию)

Если вам нужно «увидеть» содержимое временных таблиц, вам нужно будет создать реальные таблицы с (уникальным) временным именем.

Вы можете отслеживать выполнение SQL с использованием SQL Profiler:

[Эти статьи предназначены для версий SQL Server более поздних версий, чем 2000, но большая часть рекомендаций та же.] *

Если у вас есть длительный процесс, который важен для вашего бизнеса, рекомендуется записать в него различные этапы (имя / номер шага, время начала и окончания).Таким образом, у вас есть базовый уровень для сравнения, когда дела идут плохо, и вы можете точно определить, какие шаги вызывают проблему быстрее.

...