Есть ли способ получить список всех текущих временных таблиц в SQL Server?

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

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

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

кроме того,

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

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

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

5 ответов


это то, что вы после?

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

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

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

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

для 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));

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

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

вы можете отслеживать SQL выполняется с помощью SQL Profiler:

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

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


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

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