Как я могу подключиться и отладить запущенную хранимую процедуру SQL Server? - PullRequest
6 голосов
/ 14 мая 2009

Я расследую странную ошибку хранимой процедуры SQL Server 2005 , которую я не могу воспроизвести, вызвав ее напрямую из Management Studio.

Поэтому я хотел бы иметь возможность:

  • установить точку останова в хранимой процедуре
  • дождитесь, пока процедура будет вызвана извне, и точка останова нажмет
  • см. Значения переданных параметров
  • пошаговое выполнение хранимой процедуры

Возможно ли это, и если да, то как?

Ответы [ 5 ]

3 голосов
/ 14 мая 2009

Вы можете попробовать «обозреватель серверов» из Visual Studio, но сервер sqlserver должен быть настроен для разрешения отладки. Вот некоторая информация: http://www.4guysfromrolla.com/articles/051607-1.aspx. Но я думаю, что сначала вы должны попробовать Profiler, как, например, Eppz. :)

1 голос
/ 14 мая 2009

Если вы не можете пройти по коду, есть два способа:

# 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'

во всех точках выхода (после любых откатов) добавить:

ВСТАВИТЬ В ЗНАЧЕНИЯ YourLogTable (..., @ 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

посылать вызовы этой процедуры, они через ваш код записывают то, что вам нужно, в файл на сервере

1 голос
/ 14 мая 2009

Обновление : я не уверен, есть ли способ присоединиться к запущенному хранимому процессу. Вы можете использовать профилировщик для получения в реальном времени трассировки выполняемых операторов (SP: StmtStarting). Также обратите внимание на Apex SQL Debug , который, кажется, имеет больше возможностей и доступен как надстройка для Management Studio.

Если у вас есть Visual Studio, его легко отладить:

Отладка хранимых процедур в Visual Studio 2005

Больше ответов здесь: Какой ваш любимый метод для отладки хранимых процедур MS SQL?

0 голосов
/ 14 мая 2009

Я бы использовал комбинацию SQL Profiler и операторов print внутри вашего оператора SQL. Не уверен в способе пошагового выполнения поэтапно, но при использовании профилировщика в сочетании с операторами print и select (если используются временные таблицы) для просмотра их содержимого во время выполнения процедуры, будет быстро пролить свет на происходящее.

0 голосов
/ 14 мая 2009

Используйте SQL Profiler для просмотра того, что происходит, когда вызывается процедура, и какие параметры передаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...