在Visual Studio 2005中调试存储过程时使用的即时窗口

4

调试存储过程可能会很麻烦,而且我不能像我想象中那样使用“立即窗口”。

在VS 2005中,调试存储过程时是否可以使用“立即窗口”?

是否有其他方法可以运行在存储过程内创建的临时表上的查询?由于临时表的作用域仅限于您定义它的存储过程。

我能否创建一个“调试器可视化程序”,在调试TSQL存储过程时查询表格?

PS:我知道有更好的方法来设计应用程序,以便您永远不必面临这种情况,但我正在查看一些遗留代码,请多多包涵;)


1
是哪种存储过程?CLR 过程还是 TSQL 过程? - Rad
我创建了许多用C++编写的扩展存储过程。你需要告诉我们你正在尝试调试的是CLR、TSQL还是纯C++存储过程。 - Simon Hughes
存储过程是TSQL存储过程。 - abhilash
4个回答

2
我不认为有任何东西能像你可以调试“真正”的应用程序代码一样调试SQL存储过程。(这涵盖了7.0、2000和2005,但对于2008版本仍存在争议。)
当我需要在不熟悉的存储过程上进行严格的调试(可能是我自己写的几个月后),我会将代码剪切到SSMS查询窗口中,用适当的DECLAREs和SETs替换参数,注释掉有问题的语句(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确实可以像“真正”的代码一样调试存储过程 - http://msdn.microsoft.com/en-us/library/zefbf0t6%28VS.71%29.aspx - abhilash
说得没错,但是(根据你提供的链接),它似乎设置起来有点棘手。如果在逐步执行过程中无法访问临时表数据,则需要采取类似这样的解决方法。 - Philip Kelley

1

很遗憾,这个功能不能通过即时窗口实现。我认为它在任何版本的Visual Studio中都没有被实现。


0

如果您的存储过程在Oracle中,您可以使用Oracle SQL Developer提供的调试功能。该工具允许您通过设置必要的断点来编译和调试存储过程。如果存储过程是用PL/SQL编写的,请毫不犹豫地选择此选项。在我的项目中,我不会从Visual Studio调试存储过程。相反,我获取传递给存储过程的输入,在该工具中以调试模式运行该过程。据我所知,您无法在从VS调试时查询临时表。


0

我倾向于编写带有打印语句的存储过程以进行调试。

然后在执行存储过程之前,我会钩入SqlConnection的信息消息,然后对返回的消息进行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

这意味着您可以在存储过程之外查询它们,但仍然将它们识别为临时表。全局临时表的名称为##,而不仅仅是#。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接