2011-08-16 81 views
44

我意识到,临时表是会话/连接绑定的,并且不可见或不可访问会话/连接。有没有办法获得SQL Server中所有当前临时表的列表?

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

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

另外,

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

我使用SQL Server 2000中

感谢您的指导。

回答

71

这是你在追求什么?

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

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

SQL Server 2000中的此失败。 – AAsk

+12

2008年:tempdb.sys .objects,2000:tempdb..sysobjects –

+5

它列出了tempdb中的许多不同对象,包括索引和全局临时表。不应该被选为答案 – FLICKER

2

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

如果你需要“看”临时表的内容,您将需要创建真实的表用(唯一的)临时名称。

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

[这些文章不迟于2000年针对SQL Server版本,但大部分建议是一样的。]

如果您有一个对您的业务非常重要的漫长流程,最好在流程中记录各个步骤(步骤名称/编号,开始时间和结束时间)。通过这种方式,您可以有一个比较基准,当事情表现不佳时,您可以更快速地确定哪些步骤会导致问题。

+0

谢谢。通过“记录使用的名称”,我是否正确地认为你的意思是将临时表名称(在创建之后)写入另一个表中? – AAsk

+0

@A问:是的,这是一种可能性。我能问你实际上想要解决什么吗?你有很多临时表吗? –

+0

我的存储过程在星期日的凌晨3点每周运行一次,通常只需要不到2个小时。上周日它继续了6个小时,还没有完成。我没有改变地再次运行 - 因此我的问题。如果它再次失败,我将在关键阶段写入消息到“调试”表,以便我看到它的进展。 – AAsk

6

您可以通过下面的查询得到临时表的列表:

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

只是一个评论,我会发现你的最后一个子句更可读,因为'和object_id(...)不为空' –

+0

这也返回永久表(这显然可能不属于我的会话) 。 –

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

可以去掉##行,如果你想包括全局临时表。

相关问题