如何调试tsql存储过程?

问题描述:

如何调试tsql存储过程。我尝试了以下链接。如何调试tsql存储过程?

http://msdn.microsoft.com/en-us/library/ms241871(v=vs.80).aspx

但我无法命中断点。有没有更好的调试方法。我的环境是

的SQL Express 2008,Visual Studio 2010中

+0

你在什么版本的VS上?如果Express [不支持](http://msdn.microsoft.com/en-us/library/yet1b7by.aspx),但无论如何看起来更相关(最新)链接。 –

您可以尝试Sql Profiler,它不会允许像“在这一点上打破”经典的调试,但给你约非常详细的信息是什么正在进行查询/ SP执行的每一步。

不幸的是,微软并没有提供它与Express Edition版本的Sql Server。 但是:)有一个很好的(相对而言,因为它没有提供很多过滤标准,存在于微软的那个过滤标准中),而且是免费的 - SQL Server 2005/2008 Express Profiler

+0

不是一回事。设置调试的重点是分成单独的行和查看变量值等。我只是自己使用'PRINT'语句,但可以使其工作。 –

+0

@Martin Smith:你说得对,这是一个分析器而不是经典的调试器,但它在开发和调试时非常有帮助(我从来没有使用过调试器,即使对于复杂的Db解决方案,总是足以使用Sql Profiler (坦率地说,微软的一个)) – sll

+0

是的,内置的调试器不值得从我记忆中打扰,IIRC你不能做你希望能够在'C#'中调试的东西 - 就像看到当前的值表变量中的行。 –

我发现SQL Managment Studio中的调试器不可靠,因为它依赖于在数据库服务器上拥有正确的权限,而这些权限并不总是可用的。

我使用的一种替代方法是将存储的proc转换为长查询。我首先将任何参数移动到变量声明并设置它们的值。对于以下示例的

ALTER PROCEDURE [dbo].[USP_ConvertFinancials] (@EffectiveDate datetime, @UpdatedBy nvarchar(100)) 
AS 
BEGIN 

    DECLARE @PreviousBusinessDay datetime 

将成为

DECLARE @Value int, 
     , @EffectiveDate datetime = '01-Jan-2011 
     , @UpdatedBy nvarchar(100) = 'System' 

这让我跑从顶部开始在存储过程中的查询。

SELECT @Value 

我也可以注释掉INSERT-SELECT语句的INSERT部分看什么:当我通过查询下移,我可以通过简单地选择它们并重新运行从上查询检查变量的值正被插入到表格和表格变量中。

使用此方法,存储过程中的错误通常变得非常明显。一旦我的查询正确运行,我可以简单地将代码复制到我的proc并重新编译。

祝你好运!

调试存储过程。

  1. 检查逻辑是否有意义。
  2. 使用断点来帮助查找问题。
  3. 尝试按照复杂流程进行模块化设计。
  4. 将任务分成多个简单的任务。
  5. 使用主存储过程来控制顶层,并使用多个子存储过程逐步完成作业。

  6. 根据优化,使用执行计划,SS Profiler和DTA工具。