【问题标题】:Is there a way to get a list of all current temporary tables in SQL Server?有没有办法获取 SQL Server 中所有当前临时表的列表?
【发布时间】:2011-10-27 21:02:51
【问题描述】:

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

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

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

或者,

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

我使用的是 SQL Server 2000。

感谢您的指导。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    [这些文章针对的是 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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-08
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        • 2019-08-28
        相关资源
        最近更新 更多