Подтвердить что ты не робот

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

Ответ 5

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

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