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

时间:2009-06-04 18:26:08

标签: sql sql-server tsql

我有一张临时桌子,不会消失。我想看看表中的内容,以确定那里可能存在哪些不良数据。如何查看临时表中的数据?

我可以在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 个答案:

答案 0 :(得分:1)

SQL Server将对本地临时表(#TableName)的访问权限限制为创建表的连接。只要创建连接的连接仍然连接,其他连接就可以访问全局临时表(## TableName)。

即使您可以在表目录中看到该表,但在尝试执行SELECT时也无法访问该表。它会为您提供“无效的对象名称”错误。

没有记录的方法来访问由其他连接创建的本地临时表中的数据。我认为在这种情况下你可能会失败。

答案 1 :(得分:1)

以低级别而不是特别容易操作的方式获取数据的一种方法是使用Paul Randal在博客文章中描述的DBCC PAGE命令:

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

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

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

pjjH

答案 2 :(得分:0)

这似乎是你明显尝试过的,但是既然你没有提到它,我会提到以防万一:

您是否尝试过“SELECT * FROM #Return_Records”?

答案 3 :(得分:0)

就像何塞·巴西利奥所说,那是属于另一个连接的临时表。如果它存在很长时间,它必须属于已经打开很长时间的连接。检查维护 - >能力监测;您可以按登录时间排序。

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

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

你可以击落可疑的连接(右击和杀死进程。)如果在杀死进程后桌子消失了,你就找到了罪魁祸首。

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