有没有办法获取 SQL Server 中所有当前临时表的列表?
Posted
技术标签:
【中文标题】有没有办法获取 SQL Server 中所有当前临时表的列表?【英文标题】:Is there a way to get a list of all current temporary tables in SQL Server? 【发布时间】:2011-10-27 21:02:51 【问题描述】:我意识到临时表是会话/连接绑定的,并且在会话/连接之外不可见或无法访问。
我有一个长时间运行的存储过程,它在各个阶段创建临时表。
有没有办法可以查看当前临时表的列表? 我需要什么权限才能这样做?
或者,
有没有一种方法可以让我看到正在运行的存储过程中正在执行的特定 SQL 语句?该过程在 SQL Server 中作为计划作业运行。
我使用的是 SQL Server 2000。
感谢您的指导。
【问题讨论】:
【参考方案1】:如果您需要“查看”临时表列表,您可以简单地记录使用的名称。 (正如其他人所指出的,可以直接查询此信息)
如果您需要“查看”临时表的内容,则需要创建具有(唯一)临时名称的真实表。
您可以使用 SQL Profiler 跟踪正在执行的 SQL:
Using SQL Server Profiler
How to Identify Slow Running Queries with SQL Profiler
[这些文章针对的是 2000 年以后的 SQL Server 版本,但大部分建议是相同的。]
如果您有一个对您的业务很重要的冗长流程,最好记录流程中的各个步骤(步骤名称/编号、开始和结束时间)。这样一来,您就有了一个基准,可以在事情表现不佳时进行比较,并且您可以更快地查明哪些步骤导致了问题。
【讨论】:
谢谢。通过“记录使用的名称”,我是否认为您的意思是将临时表名称(创建后)写入另一个表? @AAsk:是的,这是一种可能性。我能问一下您实际上要解决的问题吗?你有很多临时表吗? 我有一个存储过程,每周日凌晨 3:00 运行一次,通常需要不到 2 小时。上周日,它持续了 6 个小时,还没有结束。我在没有改变的情况下再次运行它 - 因此我的问题。如果再次失败,我会将关键阶段的消息写入“调试”表,以便查看其进度。 除了“具有(唯一)临时名称的真实表”之外,您还可以考虑“具有 SPID/session_id 键的单个真实表”...【参考方案2】:这就是你所追求的吗?
select * from tempdb..sysobjects
--for sql-server 2000 and later versions
select * from tempdb.sys.objects
--for sql-server 2005 and later versions
【讨论】:
这在 SQL Server 2000 中失败。 2008 年:tempdb.sys.objects,2000 年:tempdb..sysobjects 这列出了 tempdb 中的许多不同对象,包括索引和全局临时表。不应选择作为答案【参考方案3】:您可以通过以下查询获取临时表列表:
select left(name, charindex('_',name)-1)
from tempdb..sysobjects
where charindex('_',name) > 0 and
xtype = 'u' and not object_id('tempdb..'+name) is null
【讨论】:
只是一个评论,我会发现你的最后一个条款更容易阅读and object_id(...) is not null
这也会返回永久表(显然可能不属于我的会话)。【参考方案4】:
对于 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));
【讨论】:
【参考方案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
如果要包含全局临时表,可以删除 ## 行。
【讨论】:
以上是关于有没有办法获取 SQL Server 中所有当前临时表的列表?的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server Compact - 计算记录/获取数据库中所有表使用的空间
有没有办法使用 SQL Server 2012 查找视图中引用的所有无效列?