20

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

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

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

当地人窗口

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

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

即时窗口

知道如何在调试会话中从表变量中获取值吗?

4

4 回答 4

14

虽然我在任何地方都找不到任何明确声明您无法检查表变量的文档,但我认为这是不可能的。从Transact-SQL 调试器

当地人观看。这些窗口显示当前分配的 Transact-SQL 表达式。表达式是计算结果为单个标量表达式的 Transact-SQL 子句。Transact-SQL 调试器支持查看引用 Transact-SQL 变量、参数或名称以 @@ 开头的内置函数的表达式。这些窗口还显示当前分配给表达式的数据值。

我的重点

也就是说,您只能检查标量。

至于您尝试使用即时窗口,调试器命令和功能的限制说:

立即显示窗口,但您不能用它做任何有用的事情,例如将变量设置为一个值,或查询数据库。


我从来没有真正使用过调试器——每次我研究它时,我都会遇到这样的限制。

这就是为什么我仍然倾向于使用“old-skool”/“printf”方法来调试 SQL -SELECT *在整个代码中自由地包含额外的 s,显示表的当前状态,以及显示其他状态的额外PRINT或消息等。然后运行RAISERROR代码正常,直到你把它敲成形状。

于 2013-07-12T08:55:13.263 回答
12

使用下面的代码,您可以将表的内容视为 XML。

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

检查 SELECT 语句返回的内容很有用。我测试了它并且它有效。

在这里阅读更多。

于 2013-09-13T09:43:49.070 回答
2

我只是简单地将选择语句放入我的脚本中,然后将其显示到结果窗口中。

从@VarTable中选择*;

现在,当我通过我的代码并点击选择时,它将显示值。然后我要么在完成测试时将它们注释掉,要么设置一个测试标志。

希望这可以帮助

于 2015-09-23T16:23:36.607 回答
0

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

在数据库中拥有一个“配置”表允许将调试代码永久添加到 SP,如果您必须经常调试它,这会有所帮助。您可以留下类似“if ({select logging level in config table}) = {debug} then select '@variable at location 1' as [@variable at location 1], * from @variable order by {一些有用的顺序} ”。

通过在结果和列名中包含变量名称和可能的位置(如果有几个地方需要检查)的方式,即使在特定表中也可以轻松区分输出中的变量变量没有行,你没想到会这样。

于 2020-04-27T18:46:49.373 回答