2011-06-22 67 views
0

如何在SQL Server 2005中調試具有多個嵌套子查詢的複雜查詢?在TSQL中調試子查詢存儲過程

我調試存儲過程和觸發器在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中似乎並沒有提供我關注的子查詢的結果的方法。另外,如果我使用臨時表來存儲結果(臨時表也在其他地方使用),我無法查看存儲在該表中的值。

反正是有,我可以添加監視或以其他方式查看這些子查詢?如果有某種方式可以「進入」查詢本身,我會很喜歡它,但我想這是不可能的。

回答

0

這就是我通常在這種場景類型中所做的: 打印出每個子查詢生成的確切sqls 然後按上面的建議在Management Studio中運行每個子查詢。 您應該檢查不同部件是否能夠提供您期望的正確數據。

1

好吧第一,我會猜疑在觸發器使用子查詢。觸發器應該儘可能快,所以擺脫可能逐行運行而不是以基於集合的方式運行的任何相關子查詢。重寫加入。如果您只想根據插入表中的內容更新記錄,請加入到記錄中。也加入到你正在更新的表格中。你究竟想用這個觸發器來完成什麼?如果我們瞭解您要實施的業務規則,那麼提供建議可能會更容易。

要調試觸發這是我做的。

我寫一個腳本:

  1. 真正的插入到表 沒有關於它
  2. 創建一個名爲#inserted (和/或一個命名#DELETED)臨時表的觸發器
  3. 填充表,因爲我期望 在觸發 inserted表從你插入填充。
  4. 添加觸發器代碼(減去 創建或更改觸發器部件) 替換#插入每次插入I 引用。 (如果您打算 運行多次,直到你 準備檢查您的 結果後使用它在觸發器中明確的交易和 回滾扔 它。
  5. 添加查詢檢查表(一個或多個) 您正在使用的觸發 你想要的值變化而變化。
  6. 現在,如果你需要添加調試 報表,看看發生了什麼步驟之間 ,你可以這樣做。
  7. 運行進行修改,直到你您想要的 結果。
  8. 一旦你的查詢作爲 工作,你可以很容易地將 插入#號,並使用 來創建觸發器的主體。