Я не думаю, что когда-либо слышал о чем-то, что позволяет вам отлаживать хранимые процедуры SQL, как вы можете отлаживать "настоящий" код приложения. (Это относится к 7.0, 2000 и 2005 гг., Но жюри по-прежнему на 2008 г.).
Когда мне нужно выполнить серьезную отладку незнакомых хранимых процедур (которые могут быть моими, спустя месяцы после их написания), я вырезаю и вставляю код в окно запроса SSMS, заменяю параметры соответствующими DECLARE и SET, закомментируйте проблемные утверждения (ВОЗВРАТ) и запустите его. В большинстве случаев временные таблицы (# временные таблицы, а не переменные @ таблицы) будут оставаться там после запуска. Поиск и замена на # на ## делает их глобальными и доступными из других окон запросов, что может помочь. Комментирование блоков кода и запуск некомментированных разделов может быть очень полезным.
Некоторые другие уловки, которые я сделал для серьезно уродливых процедур (сотни или даже тысячи строк кода):
Добавить параметр @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, так как тестирование текущего состояния, проверка содержимого таблицы и, как правило, ковыряние во время пошагового выполнения кода может привести к блокировке, взаимоблокировкам или крайне несовместимым результатам, если кто-либо еще использует базу данных на в то же время - и я бы не хотел иметь даже отдаленную возможность, чтобы это когда-либо происходило на любом производстве, за которое я отвечал.