查看存储过程创建的临时表

6
我有一个在SQL 2005中的存储过程。存储过程实际上是在SP开始时创建临时表,并在结束时删除它。我现在正在VS 2005中调试SP。在SP之间,我想知道临时表的内容。有人可以帮忙在运行时查看临时表的内容吗?
谢谢。 Vinod T
6个回答

15

有几种临时表,我认为你可以使用在存储过程使用后不会被删除的表。只需确保不要调用相同的存储过程两次,否则将出现试图创建已存在表的错误。或者在查看其内容后删除临时表。因此,不要使用表变量(@table),而是使用#table##table


来源:http://arplis.com/temporary-tables-in-microsoft-sql-server/:

本地临时表

  • 本地临时表的名称以单个数字符号(#)作为前缀,例如(#table_name)。
  • 本地临时表仅对当前会话可见,或者说它们仅对用户的当前连接可见。当用户断开与Microsoft SQL Server实例的连接时,它们将被删除。

全局临时表

  • 全局临时表的名称以双重数字符号(##)作为前缀,例如(##table_name)。
  • 全局临时表对所有会话都可见,或者说它们在创建后对任何用户可见。
  • 当所有引用该表的用户从Microsoft SQL Server断开连接时,它们将被删除。

这也是我立刻想到的。+1。 - ConcernedOfTunbridgeWells
具体来说:我改变了 SP 并将 #<tablename> 改为 ##<tablename>,将临时表移动到全局空间。使用 VS 调试器逐步执行存储过程,在填充临时表后停止,最后使用独立的 SQL 连接来查询(现在是全局的)临时表。 - MarcE

7

编辑存储过程以在运行时暂时从临时表中选择 *(可能是到另一个表或文件,或仅到输出窗格)。

然后您可以稍后将其改回来。如果无法更改原始过程,请复制它并编辑副本。


我考虑过这样做...但我要处理的表格数量非常庞大。所以我想知道是否有任何方法可以在类似于观察窗口的地方获取它。 - Vinod
BIDS或SSMS中没有这样的功能。您需要显式修改存储过程以将表内容记录在某个地方或选择它们,以便存储过程返回记录集进行调试。不要忘记在调试代码之后注释掉它。 - ConcernedOfTunbridgeWells
这种方法或其变体是调试存储过程的主要方法。+1 - ConcernedOfTunbridgeWells

6

我创建了一些存储过程,可以让您查询在另一个会话中创建的临时表的内容。

请查看GitHub上的sp_select项目。

无论在哪个会话中运行exec sp_select 'tempdb..#temp',都可以显示表的内容。


3

底线是:默认的Visual Studio Microsoft调试器与正在执行和调试的SQL代码不在同一会话中。

因此,您只能通过将它们切换为全局##temp表或永久表或任何跨会话工作的最佳技术来查看#temp表。

注意:这与普通语言调试器非常不同……我怀疑Microsoft故意保持这种方式……几十年前就有第三方SQL调试工具没有这个问题。

没有好的技术原因,为什么调试器不能在与SQL代码相同的会话中,从而允许您检查所有生成的结构,包括#temp表。


1

这对我很有帮助。

SELECT * FROM #Name

USE [TEMPDB]
GO

SELECT * FROM syscolumns 
   WHERE id = ( SELECT id FROM sysobjects WHERE [Name] LIKE '#Name%')

这将提供所有临时表的详细信息


1

关于之前建议将数据放入永久表中的进一步扩展,你可以尝试以下方法:

-- Get rid of the table if it already exists
if object_id('TempData') is not null
  drop table TempData

select * into TempData from #TempTable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接