在SQL存储过程中调试子查询

时间:2011-06-22 15:11:19

标签: sql-server-2005 tsql debugging visual-studio-2005

如何在SQL Server 2005中使用多个嵌套子查询调试复杂查询?

我正在调试Visual Studio 2005中的存储过程和触发器。我希望能够看到这些子查询的结果是什么,因为我觉得这是bug的来源。下面是一个示例查询(略微编辑):

UPDATE
               foo
          SET
               DateUpdated = ( SELECT TOP 1 inserted.DateUpdated FROM inserted )
              ...
          FROM
               tblEP ep
               JOIN tblED ed ON ep.EnrollmentID = ed.EnrollmentID
          WHERE
               ProgramPhaseID = ( SELECT ...)

Visual Studio似乎没有为我提供查看子查询结果的方法。另外,如果我使用临时表来存储结果(临时表也在别处使用),我无法查看存储在该表中的值。

无论如何我可以添加手表或以其他方式查看这些子查询吗?如果有某种方式“逐步进入”查询本身,我会喜欢它,但我想这是不可能的。

2 个答案:

答案 0 :(得分:1)

好的,首先我会在触发器中使用子查询。触发器应尽可能快,因此请删除可能逐行而不是基于集合的方式运行的任何相关子查询。重写加入。如果您只想根据插入表中的内容更新记录,请加入它。也加入您正在更新的表。你想用这个触发器完成什么?如果我们了解您要实施的业务规则,则可能更容易提供建议。

要调试触发器,这就是我的工作。

我写了一个脚本:

  1. 将实际插入物放到桌子上 没有触发器就可以了
  2. 创建名为#inserted的临时表 (和/或一个名为#deleted)
  3. 按照我的预期填充表格 触发器中插入的表格 从您插入的文件填充。
  4. 添加触发器代码(减去 创建或更改触发器部件) 每次代替#inserted 参考插入。 (如果你打算 多次运行直到你 准备在触发投掷中使用它 它在一个明确的交易和 检查后你回滚 结果。
  5. 添加查询以检查表格 你正在改变触发器 你想要改变的价值。
  6. 现在,如果您需要添加调试 陈述,看看发生了什么 在步骤之间,你可以这样做。
  7. 运行更改,直到获得 你想要的结果。
  8. 一旦您将查询作为 你期望它,它很容易采取 插入#标志并使用它 创建触发器的主体。

答案 1 :(得分:0)

这是我在这种类型的场景中通常做的事情: 打印出每个子查询生成的确切sqls 然后按照上面的建议在Management Studio中运行每个。 您应该检查不同的部件是否为您提供了您期望的正确数据。

相关问题