代码之家  ›  专栏  ›  技术社区  ›  Danny G

从SQL Server临时表导出/查看数据

  •  0
  • Danny G  · 技术社区  · 17 年前

    我有一张临时的桌子,那是不会离开的。我想看看表中有什么,以确定其中可能有哪些坏数据。如何查看临时表中的数据?

    我可以在里面看到 tempdb . 我跑

    SELECT * FROM tempdb.dbo.sysobjects WHERE Name LIKE '#Return_Records%'
    

    获取表的名称。

    我可以在中看到它的列和对象ID

    select c.*
    from tempdb.sys.columns c
    inner join tempdb.sys.tables t ON c.object_id = t.object_id
    where t.name like '#Return_Records%'
    

    如何获取数据?

    顺便说一下,这不管用

    SELECT * FROM #Return_Records 
    
    4 回复  |  直到 15 年前
        1
  •  1
  •   Paul Harrington    17 年前

    一种以低级且不特别容易操作的方式获取数据的方法是使用paul randal在博客文章中描述的dbcc page命令:

    http://blogs.msdn.com/sqlserverstorageengine/archive/2006/06/10/625659.aspx

    您应该能够通过查询sysindexes找到对象中第一页的文件ID和页码。我上次这样做是在SQL Server 7上。

    如果数据在数据库中,那么DBCC页将能够转储它。

    PJJH

        2
  •  1
  •   Jose Basilio    17 年前

    SQL Server将对本地临时表(tablename)的访问限制为创建该表的连接。只要创建全局临时表的连接仍处于连接状态,其他连接就可以访问它(tablename)。

    即使您可以在表目录中看到该表,但在尝试进行选择时也无法访问该表。它会给您一个“无效的对象名”错误。

    没有文档记录的方法可以访问由其他连接创建的本地临时表中的数据。我想在这种情况下你可能会走运。

        3
  •  0
  •   Matthew Groves    17 年前

    这似乎是你尝试过的,但既然你没有提及,我想我会提及以防万一:

    您是否尝试过“从返回记录中选择”?。

        4
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

    就像Jos_)Basilio说的,那是属于另一个连接的临时桌子。如果它存在很长时间,它一定属于一个已经打开很长时间的连接。检查维护->活动监视器;您可以按登录时间排序。

    检查登录时间或上次批处理时间是否与临时表的创建日期匹配。可通过以下方式检索:

    select crdate from tempdb.dbo.sysobjects WHERE Name LIKE '#Return_Records%'
    

    您可以击落可疑的连接(右键单击并终止进程)。如果表在终止进程后消失,您就找到了罪魁祸首。

    要只删除表,请重新启动SQL Server服务。可以在使用筛选器后立即附加SQL事件探查器,以开始查找创建临时表的连接。