有没有办法获取SQL Server中所有当前临时表的列表?

时间:2011-08-16 08:29:19

标签: sql sql-server sql-server-2000 temp-tables

我意识到临时表是会话/连接绑定的,不可见或可以在会话/连接之外访问。

我有一个长期运行的存储过程,可以在各个阶段创建临时表。

有没有办法可以看到当前临时表的列表? 我需要什么特权才能这样做?

可替换地,

有没有办法可以看到正在运行的存储过程中执行的特定SQL语句?该过程作为SQL Server中的预定作业运行。

我正在使用SQL Server 2000。

感谢您的指导。

5 个答案:

答案 0 :(得分:91)

这就是你想要的吗?

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

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

答案 1 :(得分:8)

您可以通过以下查询获取临时表列表:

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 :(得分:2)

如果您需要“查看”临时表列表,您只需记录使用的名称即可。 (正如其他人所说,可以直接查询此信息)

如果您需要“查看”临时表的内容,则需要创建具有(唯一)临时名称的真实表。

您可以使用SQL事件探查器跟踪正在执行的SQL:

[这些文章的目标是2000年以后的SQL Server版本,但大部分建议是相同的。]

如果您有一个对您的业务很重要的冗长流程,那么在流程中记录各个步骤(步骤名称/编号,开始和结束时间)是个好主意。这样你就有了一个基准来比较什么时候表现不好,你可以更快地确定导致问题的步骤。

答案 3 :(得分:2)

对于SQL Server 2000,这应该只告诉您会话中的#temp表。 (改编自my example for more modern versions of SQL Server here。)这假设您没有为具有三个连续下划线的表命名,例如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));

答案 4 :(得分: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

如果要包含全局临时表,可以删除##行。