簡體   English   中英

在Visual Studio 2005中調試存儲過程時的立即窗口

[英]Immediate Window while debugging Stored Procs in Visual Studio 2005

調試存儲的sproc可能是威脅,我無法像我想象的那樣使用立即窗口。

在VS 2005中調試存儲過程時,是否可以使用即時窗口?

有沒有其他方法我可以在臨時表上運行查詢,我在存儲過程中創建? 由於臨時表的范圍僅在存儲過程中,因此您可以定義它。

我可以在調試TSQL存儲過程時創建一個Debugger Visualizer來查詢表

PS :我知道有更好的方法來管理您的應用程序,以便您永遠不必處於這種情況,但我正在查看一些遺留代碼,所以請有一些憐憫;)

我不認為我聽說過任何可以調試SQL存儲過程的東西,就像你可以調試“真正的”應用程序代碼一樣。 (這涵蓋了7.0,2000和2005年,但評委會仍然在2008年)。

當我不得不對不熟悉的存儲過程進行認真的調試時(可能是我的,在我編寫它們的幾個月后),我將代碼粘貼到SSMS查詢窗口,用適當的DECLARE和SET替換參數,注釋掉有問題的存儲過程語句(RETURN),然后運行它。 在大多數情況下,臨時表(#temp表,而不是@表變量)在運行后仍然存在。 使用##搜索和替換#使它們成為全局的,並且可以從其他查詢窗口訪問,這可以提供幫助。 注釋掉代碼塊並運行未注釋的部分可能非常有用。

我為嚴重丑陋的程序(數百甚至數千行代碼)所做的其他一些技巧:

添加參數@Debug,默認為0.在過程的相關部分中,添加“IF @Debug = 1”塊,您可以在其中打印當前變量值和/或臨時表內容。 一個有用的形式可以是:

SELECT 'DebugBlock3' DataSet, * from #MyTempTable

在此基礎上,另一個技巧是定義#Temp表,如下所示:

IF @Debug = 0 or object_id('tempdb.dbo.#MyTempTable') is null
    CREATE TABLE #MyTempTable
     (
       ProductId  int  not null
      ,etc
     )

有了這個,如果你首先在查詢窗口中創建#Temp表,然后從同一個窗口調用@Debug = 1的過程,一旦完成過程,臨時表仍然會在那里,填充任何最終內容是。

當使用動態代碼(顫抖)時,我不變地將@Debug設置為使用值0,1和2,並帶有注釋

--  Debug control:  0=do the work, 2=List out dynamic code, 1=Both

隨后的代碼塊如下:

IF @Debug > 0
 BEGIN
    PRINT 'Comment about the following chunk of text'
    PRINT '-----------------------------------------------------------'
    PRINT @Command
 END
IF @Debug < 2
    EXECUTE (@Command)

是的,這是一種痛苦,並不是特別方便,但這是我隨着時間的推移而想出來的。 老實說,我不認為你可以在SQL中進行嚴格的調試,因為測試當前狀態,檢查表內容,並且在逐步執行代碼時通常會四處尋找,如果其他人在使用數據庫時,可能會導致阻塞,死鎖或非常不一致的結果同時 - 我甚至不想在我負責的任何生產中發生這種偶然發生的可能性。

遺憾的是,沒有通過立即窗口實現此功能。 我不相信它已經在任何版本的Visual Studio中

如果存儲過程是在oracle中,則可以使用oracle sql developer提供的調試功能。 此工具允許您通過在需要時設置斷點來編譯和調試過程。 如果存儲過程是用pl sql編寫的,那么盲目地去做。 在我的項目中,我不從Visual Studio調試存儲過程。 相反,我得到傳遞給存儲過程的輸入,轉到該工具並使用該輸入在調試模式下運行proc.AFAIK,從VS調試時無法查詢臨時表。

我傾向於使用Print語句編寫存儲過程以進行調試。

然后在執行存儲過程之前,我掛鈎到SqlConnections信息消息,然后對返回的消息執行Debug.Write。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.infomessage%28VS.71%29.aspx

對於臨時表查詢,您可以在調試時將它們設置為全局臨時表http://www.sqlteam.com/article/temporary-tables

這意味着您可以在存儲過程之外查詢它們,但仍將它們識別為臨時表。 全局臨時表名為##而不是#。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM