我想使用 SSMS 2012 调试复杂的 T-SQL 脚本。
我可以在调试模式下运行脚本并放置断点,以及单步执行我的脚本,但我看不到存储在我的表变量中的值。
在Locals
窗口中,我看到了所有这些变量,但它们的值显示为(table)
:
无法通过上下文菜单或单击变量来查看变量的内容。
我尝试使用Immediate Window
对表变量运行查询,但这似乎也不起作用。
知道如何在调试会话中从表变量中获取值吗?
我想使用 SSMS 2012 调试复杂的 T-SQL 脚本。
我可以在调试模式下运行脚本并放置断点,以及单步执行我的脚本,但我看不到存储在我的表变量中的值。
在Locals
窗口中,我看到了所有这些变量,但它们的值显示为(table)
:
无法通过上下文菜单或单击变量来查看变量的内容。
我尝试使用Immediate Window
对表变量运行查询,但这似乎也不起作用。
知道如何在调试会话中从表变量中获取值吗?
虽然我在任何地方都找不到任何明确声明您无法检查表变量的文档,但我认为这是不可能的。从Transact-SQL 调试器
当地人和观看。这些窗口显示当前分配的 Transact-SQL 表达式。表达式是计算结果为单个标量表达式的 Transact-SQL 子句。Transact-SQL 调试器支持查看引用 Transact-SQL 变量、参数或名称以 @@ 开头的内置函数的表达式。这些窗口还显示当前分配给表达式的数据值。
(我的重点)
也就是说,您只能检查标量。
至于您尝试使用即时窗口,调试器命令和功能的限制说:
立即显示窗口,但您不能用它做任何有用的事情,例如将变量设置为一个值,或查询数据库。
我从来没有真正使用过调试器——每次我研究它时,我都会遇到这样的限制。
这就是为什么我仍然倾向于使用“old-skool”/“printf”方法来调试 SQL -SELECT *
在整个代码中自由地包含额外的 s,显示表的当前状态,以及显示其他状态的额外PRINT
或消息等。然后运行RAISERROR
代码正常,直到你把它敲成形状。
使用下面的代码,您可以将表的内容视为 XML。
DECLARE @v XML = (SELECT * FROM <tablename> FOR XML AUTO)
检查 SELECT 语句返回的内容很有用。我测试了它并且它有效。
在这里阅读更多。
我只是简单地将选择语句放入我的脚本中,然后将其显示到结果窗口中。
从@VarTable中选择*;
现在,当我通过我的代码并点击选择时,它将显示值。然后我要么在完成测试时将它们注释掉,要么设置一个测试标志。
希望这可以帮助
在代码中包含一个 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 {一些有用的顺序} ”。
通过在结果和列名中包含变量名称和可能的位置(如果有几个地方需要检查)的方式,即使在特定表中也可以轻松区分输出中的变量变量没有行,你没想到会这样。