调试存储过程可能会很麻烦,而且我不能像我想象中那样使用“立即窗口”。
在VS 2005中,调试存储过程时是否可以使用“立即窗口”?
是否有其他方法可以运行在存储过程内创建的临时表上的查询?由于临时表的作用域仅限于您定义它的存储过程。
我能否创建一个“调试器可视化程序”,在调试TSQL存储过程时查询表格?
PS:我知道有更好的方法来设计应用程序,以便您永远不必面临这种情况,但我正在查看一些遗留代码,请多多包涵;)
调试存储过程可能会很麻烦,而且我不能像我想象中那样使用“立即窗口”。
在VS 2005中,调试存储过程时是否可以使用“立即窗口”?
是否有其他方法可以运行在存储过程内创建的临时表上的查询?由于临时表的作用域仅限于您定义它的存储过程。
我能否创建一个“调试器可视化程序”,在调试TSQL存储过程时查询表格?
PS:我知道有更好的方法来设计应用程序,以便您永远不必面临这种情况,但我正在查看一些遗留代码,请多多包涵;)
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调试存储过程。相反,我获取传递给存储过程的输入,在该工具中以调试模式运行该过程。据我所知,您无法在从VS调试时查询临时表。
我倾向于编写带有打印语句的存储过程以进行调试。
然后在执行存储过程之前,我会钩入SqlConnection的信息消息,然后对返回的消息进行Debug.Write操作。
对于临时表查询,您可以在调试时将它们设置为全局临时表http://www.sqlteam.com/article/temporary-tables
这意味着您可以在存储过程之外查询它们,但仍然将它们识别为临时表。全局临时表的名称为##,而不仅仅是#。