如何附加和调试正在运行的SQL Server存储过程?

时间:2009-05-14 15:15:10

标签: sql-server debugging

我正在调查an odd error from a SQL Server 2005 stored procedure我无法通过直接从Management Studio调用它来重现。

因此我希望能够:

  • 在存储过程中设置断点
  • 等待从外部调用该过程,然后点击
  • 查看传入参数的值
  • 逐步执行存储过程

这是可能的,如果是这样的话?

5 个答案:

答案 0 :(得分:3)

您可以尝试使用visual studio中的“server explorer”,但需要配置sqlserver以允许调试。以下是一些信息:http://www.4guysfromrolla.com/articles/051607-1.aspx。但我认为你首先应该尝试像Eppz这样的Profiler。 :)

答案 1 :(得分:1)

更新:我不确定是否有办法附加到正在运行的存储过程。您可以使用分析器获取执行语句的实时跟踪(SP:StmtStarting)。另请查看Apex SQL Debug,它似乎具有更多功能,可作为Management Studio的插件使用。

如果您有Visual Studio,则可以轻松调试:

Debugging Stored Procedures in Visual Studio 2005

更多答案: What’s your favored method for debugging MS SQL stored procedures?

答案 2 :(得分:1)

如果您无法单步执行代码,可以采用以下两种方法:

#1连接一个字符串,然后插入日志文件。

声明一个类似的变量:

DECLARE @Loginfo varchar(7500)

在您完成代码的过程中将调试信息附加到其中:

SET @LogInfo=ISNULL(@LogInfo)+'#01> @x='+COALESCE(CONVERT(varchar(10),@x),'NULL')
..
SET @LogInfo=ISNULL(@LogInfo)+'#02>'
..
SET @LogInfo=ISNULL(@LogInfo)+'#03> top loop'

在所有退出点(在任何回滚之后)添加:

INSERT INTO YourLogTable VALUES(...,@ LogInfo)

取决于交易使用情况,特别是您的错误,您可能只需插入多次而不用担心回滚,因此您需要根据自己的情况进行更改。

#2写入sq服务器上的文本文件

这可能不是一个选项,因为它使用非常不安全的xp_cmdshell存储过程。但是,如果您可以使用它,并且如果来自调用应用程序的事务导致问题,请尝试创建此存储过程:

CREATE PROC log_message
     @Message         varchar(255)
    ,@FileName        varchar(100)
    ,@OverWrite       char(1) = 'N'
AS

/*
Log messages to server side text files from stored procedures/triggers/sql scripts

  Input parameters:
      Message   - message to put in the log file 
      FileName  - path and name of the file to log the message into
      OverWrite - 'Y'=overwrite entire file with current message
                  'N'=append current message onto end of file

  Return code:
      0 - everything was fine
      1 - there was an error


        NOTE: the command to log the message can not be longer than 255 characters,
              as a result the message and file name should be less than 245 chars combined


  Example: EXEC log_message 'Duplicates found','C:\logfile.txt', 'N'
      append the "Duplicates found" message onto the server's "C:\logfile.txt" file

*/

BEGIN
    SET NOCOUNT ON

    DECLARE @ExecuteString    VARCHAR(255)   --command string can only be 255 chars long
    DECLARE @ReturnValue           int

    --build command string
    SET @ExecuteString = RTRIM('echo ' + COALESCE(LTRIM(@Message),'-')
        + CASE WHEN (@OverWrite = 'Y') THEN ' > ' ELSE ' >> ' END + RTRIM(@FileName))

    --run command string
    EXEC @ReturnValue=master..xp_cmdshell @ExecuteString
    --IF @ReturnValue!=0
    --    PRINT 'command failed, return value='+CONVERT(varchar(40),@ReturnValue)

    RETURN @ReturnValue

    SET NOCOUNT OFF
END

通过您的代码将对所需内容的调用写入服务器上的文件

,以此来调用此过程

答案 3 :(得分:0)

使用SQL Profiler查看调用过程时传递的内容以及传入的参数。

答案 4 :(得分:0)

我会在SQL语句中使用SQL Profiler和print语句的组合。不知道有哪种方法逐行逐行,但使用profiler结合print和select语句(如果使用临时表)来查看其内容,因为proc运行将很快揭示正在发生的事情。