【问题标题】:Debugging sub-queries in TSQL Stored Procedure在 SQL 存储过程中调试子查询
【发布时间】:2011-09-20 11:51:05
【问题描述】:

如何在 SQL Server 2005 中调试具有多个嵌套子查询的复杂查询?

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

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 似乎没有为我提供查看子查询结果的方法。此外,如果我使用临时表来存储结果(临时表也在其他地方使用),我无法查看存储在该表中的值。

我是否可以添加手表或以其他方式查看这些子查询?如果有某种方法可以“进入”查询本身,我会很高兴,但我想那是不可能的。

【问题讨论】:

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


    【解决方案1】:

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

    要调试触发器,这就是我所做的。

    我写了一个脚本来:

    1. 对表进行实际插入 没有触发器就可以了
    2. 创建一个名为#inserted 的临时表 (和/或一个名为#deleted)
    3. 按照我的预期填充表格 触发器中插入的表 从您所做的插入中填充。
    4. 添加触发代码(减去 创建或更改触发部件) 每次我都替换#inserted 插入参考。 (如果你打算 运行多次,直到你 准备在触发投掷中使用它 它在显式事务中,并且 检查后回滚 结果。
    5. 添加查询以检查表 您正在使用触发器进行更改 您想要更改的值。
    6. 现在如果你需要添加调试 声明以查看正在发生的事情 在步骤之间,您可以这样做。
    7. 运行进行更改,直到获得 您想要的结果。
    8. 一旦您将查询作为 你期望它,它很容易接受 # 符号关闭插入并使用它 创建触发器的主体。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多