如何在MS SQL Management Studio 2012的调试会话中查看表变量中的数据?

20

我想使用SSMS 2012调试一个复杂的T-SQL脚本。

我可以在调试模式下运行脚本并设置断点,以及逐步执行我的脚本,但我无法看到存储在表变量中的值。

Locals窗口中,我可以看到所有这些变量,但它们的值显示为(table)

Locals window

无法通过上下文菜单或单击变量来查看变量的内容。

我尝试使用Immediate Window对表变量运行查询,但似乎也不起作用。

Immediate Window

有任何想法如何在调试会话中获取表变量的值吗?


可能是如何在T-SQL调试时查看表变量的值?的重复问题。 - Faiz
4个回答

14
虽然我找不到任何明确说明无法检查表变量的文档,但我认为这是不可能的。来自Transact-SQL Debugger
“Locals”和“Watch”。这些窗口显示当前分配的Transact-SQL表达式。表达式是评估为单个标量表达式的Transact-SQL子句。Transact-SQL调试器支持查看引用Transact-SQL变量、参数或名称以@@开头的内置函数的表达式。这些窗口还显示当前分配给表达式的数据值。
(我强调)
也就是说,您只能检查标量。
至于您尝试使用即时窗口的方式,Limitations on Debugger Command and Features中说:
“Immediate”窗口已经显示,但您不能使用它来设置变量的值或查询数据库等有用的操作。请注意保留HTML标签。
我从来没有真正使用过调试器 - 每次我尝试使用它时,都会遇到像这样的限制。这就是为什么我仍然倾向于使用“老派”/“printf”方法来调试SQL - 在代码中自由地包含额外的SELECT *,显示表格的当前状态,并包括额外的PRINTRAISERROR消息,显示其他状态等。然后只需正常运行代码,直到将其调整为所需状态。

谢谢您的研究,我的研究也没有产生任何结果。我只是不想相信它是不可能的,因为在我看来,这使调试器完全无法使用。 “老派”的调试问题在于我们刚刚“梳理”了代码以不包含任何调试/注释/无法到达的语句(根据我们的编码政策要求),而我需要将它们重新带回来... - Alexander Galkin

12

使用下面的代码,您可以将表格内容以 XML 格式查看。

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

检查SELECT语句返回的内容是很有用的。我测试了一下,它有效。

在此处阅读更多信息here.


1
这个不起作用。我无法在本地窗口中看到@v。 - Naren
1
@Naren 我已经验证过了。它在本地窗口中可以工作,我可以看到@v变量中填充的值。我正在使用SQL Server 2008 R2的SQL Server管理工具。 - RBT
你可以在“FOR XML”子句中添加“,ROOT('rootNodeName')”。这将收集多个行(如果有的话)在单个根下,从而生成一个合法的XML文档,可以使用XML可视化器查看,而不是文本可视化器。 - JohnL4

2

我只是简单地在脚本中放置select语句,然后它会将结果显示到结果窗口中。

从@VarTable选择*;

现在当我逐步执行代码并命中select时,它将显示这些值。 然后我要么在测试完成后将它们注释掉,要么设置一个测试标志。

希望这能帮到你。


0

在代码中包含select语句是我知道并且能想到的唯一方法。

在数据库中拥有一个'配置'表,可以永久添加调试代码到存储过程(SP),这有助于经常需要调试时。您可以留下像 "if ({config table 中选择日志级别}) = {debug} then select '@variable at location 1' as [@variable at location 1], * from @variable order by {some useful order}" 这样的代码。

使用我所包含的变量名以及可能的位置(如果有多个需要检查的位置)在结果和列名中,即使特定表变量没有行且您没有预期到这一点,也很容易区分输出中的变量。


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