如何在T-SQL中调试时查看表变量的值?

204

在SQL Server Management Studio(SSMS)调试期间,我们是否可以查看表值变量中的值(行和单元格)?如果可以,如何操作?

输入图像描述

9个回答

332
DECLARE @v XML = (SELECT * FROM <tablename> FOR XML AUTO)

在您想要查看表内容的位置插入上述语句。表的内容将以XML形式呈现在本地窗口中,或者您可以在观察窗口中添加@v

在观察窗口中查看表的内容


1
这绝对是一个足够好的解决办法,适用于将小表格呈现为XML格式。 - Faiz
4
但仍然不要停止阅读!下面还有一个很棒的选择! 非常棒的帖子!! - Mike M
1
我有一些大表格,其中的XML不太友好,难以阅读。我采取了另一种方法——将XML复制并粘贴到http://xmlgrid.net/中,您可以将XML显示为表格。表格可视化确实很有帮助。期待SSMS发布一个类似于Visual Studio中datatable查看器的表格查看器。 - Moiz Tankiwala
1
你可以在“FOR XML”子句中添加“,ROOT('rootNodeName')”。这将收集多个行(如果有的话)在单个根下,从而生成一个合法的XML文档,可以使用XML可视化器查看,而不是文本可视化器。 - JohnL4
5
您可以使用 SQL Server 2016 或更高版本,也可以使用 JSON 版本来执行以下操作:DECLARE @v nvarchar(max) = (SELECT * FROM <tablename> FOR JSON AUTO)该语句可以将指定表格中的数据转换成 JSON 格式,并将其赋值给变量 @v。 - Sousuke
显示剩余3条评论

32

4
在MS SQL Management Studio中,如何在调试会话期间查看表变量中的数据?在调试窗口的“自动监视”或“局部变量”选项卡中,可以展开表变量并查看其内容。此外,您还可以使用“SELECT * FROM @tablename”语句在查询窗口中查看表变量的内容。 - qdev76
2
我们现在已经到了2016年,但情况并没有变得更好。连接链接也不再起作用了。 - dotNET
6
说实话,这并不是一个真正的答案,因为它没有回答问题,问题是如何做到这一点(而不是 SSMS 是否有任何功能),声明尽管有显示值的方法但这个功能未被实现并不是很有帮助。 - Răzvan Flavius Panda
2
请删除此答案。下面的答案应该被接受。 - Vortex852456
2018,依然不行。 - AgentFire
显示剩余3条评论

20

这个项目 https://github.com/FilipDeVos/sp_select 包含了一个存储过程 sp_select,它可以从临时表中进行选择。

用法:

exec sp_select 'tempDb..#myTempTable'

在调试存储过程时,你可以打开一个新标签页并运行此命令以查看临时表的内容。


7
适用于临时表,但不适用于表变量。 - Harag
如果存在未关闭的事务,也会挂起,因此在使用调试框架(如tSQLt)进行测试时并不是很有用。 - Nathan
1
哇哇哇哇 - vothaison
很好 - 如果您可以按单个或两个列进行排序,那就太棒了。 - user2486488
绝对是一个非常棒的解决方案,感谢分享! - B.M.

7
如果你使用的是 SQL Server 2016 或更高版本,那么你也可以将其选择为 JSON 结果,并在 JSON 可视化工具中显示,这比在 XML 中阅读要容易得多,而且允许你过滤结果。
DECLARE @v nvarchar(max) = (SELECT * FROM Suppliers FOR JSON AUTO)

enter image description here


对于不熟悉 JSON 可视化工具的人(比如我),可以在 Locals 或 Watch 窗口中变量的“值”旁边找到下拉菜单。选择 JSON,即可得到此处所示的窗口。 - David Wohlferd

7

在存储过程中创建一个全局临时表##temptable,并编写一个插入查询语句将您的表中的数据插入到此临时表中。

完成后,您可以通过打开新的查询窗口来检查临时表的内容。只需使用"select * from ##temptable"即可。


0

SQL Server Profiler 2014可以列出表值参数的内容。在之前的版本中也可能适用。 在存储过程组和TextData列中启用SP:Starting或RPC:Completed事件,当您单击日志中的条目时,将显示表变量的插入语句。 然后,您可以复制文本并在管理工作室中运行。

示例输出:

declare @p1 dbo.TableType
insert into @p1 values(N'A',N'B')
insert into @p1 values(N'C',N'D')

exec uspWhatever @PARAM=@p1

0

我得出结论,没有任何插件是不可能实现的。


我看到了一些Visual Studio 2010的预览。非常花哨、复杂和详细...演示者不知道临时表是否可以在调试模式下查看。也许等它发布了再说吧,但我不抱太大希望。 - Philip Kelley

-2
为什么不直接选择表格并以这种方式查看变量呢?
SELECT * FROM @d

6
请说明如何进行操作。在正在调试的脚本中添加SELECT * FROM @Table不会将结果输出到结果窗口。 - StingyJack
T-SQL调试工具已从Management Studio中移除。一个原因可能是许多编写大量T-SQL的人不使用它,主要因为它不允许您在断点处执行SQL。相反,我会复制过程并创建一个新的过程或批处理,并向该代码添加调试选择。听起来很笨重,但对于我数百种情况来说,这一直是最好的方式。 - R.M. Buda

-2

抱歉,我有点晚来参加派对,但是对于任何在以后的日期偶然发现这个问题的人,我发现在存储过程中最简单的方法是:

  1. 创建一个新的查询,声明并初始化任何过程参数。
  2. 粘贴您的过程主体。
  3. 在您的表变量初始化数据之后立即添加一个好的旧式选择查询。
  4. 如果第3步不是过程中的最后一条语句,请在同一行上设置断点,开始调试并直接继续到断点。
  5. 获利!

messi19的答案应该是被接受的,在我看来,因为它比我的更简单,并且大多数情况下都能胜任,但如果像我一样,您想要检查循环内部的表变量,那么这种方法可以轻松地完成工作,而无需太多的努力或外部SSMS插件。


1
这完全与OP试图做的相反。 - Jamie Marshall

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