2009-07-15 99 views
4

調試存儲的sproc可能是威脅,&我無法像我想象的那樣使用立即窗口。在Visual Studio 2005中調試存儲過程時的立即窗口

在VS 2005中調試存儲過程時是否有立即可用的窗口?

是否有任何其他方式可以在我在Stored Proc內部創建的臨時表上運行查詢?由於臨時表的範圍僅在存儲過程中進行定義。

我能創造一個調試器可視查詢,而我調試存儲的特效

PS一個TSQL的表格:我知道有更好的方法來拱您的應用程序,讓你永遠不會有在這情況,但我正在看一些遺留代碼,所以請有一些憐憫;)

+1

什麼樣的存儲過程? CLR程序或TSQL程序? – Rad 2009-09-03 09:59:05

+0

我創建了許多用C++編寫的擴展存儲過程。您需要告訴我們它的CLR,TSQL或純C++存儲過程是否會嘗試調試。 – 2009-09-07 13:37:14

回答

0

如果您存儲的特效是在oracle中,您可以使用由oracle sql developer提供的調試功能。這個工具可以讓你通過在需要的地方設置斷點來編譯和調試你的proc。如果存儲過程是用pl sql編寫的,那麼請盲目去做這件事。在我的項目中,我沒有從Visual Studio中調試存儲過程。相反,我得到了傳遞給存儲過程的輸入,轉到該工具並使用該輸入在調試模式下運行proc.AFAIK,在從VS調試時不能查詢臨時表。

2

我不認爲我聽說過任何可以調試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中進行嚴肅的調試,因爲測試當前狀態,檢查表格內容,並且在逐步執行代碼時通常會四處漫步,如果其他人正在使用該數據庫,可能會導致阻塞,死鎖或非常不一致的結果同一時間 - 我甚至不願意在我負責的任何製作中發生這種可能性。

0

爲了進行調試,我傾向於使用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

這意味着你可以查詢他們的存儲過程之外,但仍然讓他們確認爲臨時表。全局臨時表命名爲##而不是#。

1

不幸的是,這個功能並沒有通過立即窗口實現。我不相信它已經出現在任何版本的Visual Studio中

相關問題