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

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

我有一个长期运行的存储过程,在不同阶段创build临时表。

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

或者,

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

我正在使用SQL Server 2000。

感谢您的指导。

这是你以后?

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)); 

如果您需要“查看”临时表的列表,则可以简单地logging使用的名称。 (正如其他人所指出的,可以直接查询这些信息)

如果您需要“查看”临时表的内容,则需要使用(唯一的)临时名称创build实际表。

您可以使用SQL Profiler来跟踪正在执行的SQL:

  • 使用SQL Server Profiler

  • 如何使用SQL Profiler识别运行速度慢的查询

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

如果您的业务stream程冗长,对您的业务至关重要,在stream程中logging各个步骤(步骤名称/编号,开始和结束时间)是个好主意。 通过这种方式,您可以有一个比较基准,当事情performance不佳时,您可以更快速地确定哪些步骤会导致问题。

 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 

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