Лучший способ понять хранимые процедуры - PullRequest
0 голосов
/ 08 мая 2009

Я пытаюсь расшифровать абсолютное чудовище хранимой процедуры, и мне не очень повезло. Существуют ли бесплатные инструменты, которые помогут визуализировать запрос или хотя бы отформатировать синтаксис в более читаемый формат?

Любые советы и подсказки также приветствуются.

Тип базы данных, которую я использую, - MS SQL Server 2005

Ответы [ 8 ]

5 голосов
/ 08 мая 2009

Найдите все используемые таблицы и нарисуйте себе ERD, чтобы лучше понять.

2 голосов
/ 08 мая 2009

Есть ли у вас под рукой копия Visual Studio? Visual Studio выделяет блоки утверждений, которые иногда могут помочь изолировать логический блок. Вы можете загрузить (бесплатно) Express Editions , если сможете сэкономить пропускную способность.

Если вы хотите что-то более легкое, здесь есть длинный список продуктов здесь .

Для советов по отладке в Stored Proc. Я бы предложил следующее:

  1. Попробуйте и определите использование объявленных переменных - особенно если на них ссылаются в различных запросах (добавляйте комментарии по мере необходимости, это поможет вам собрать их вместе)
  2. Посмотрите, сможете ли вы скопировать фрагменты sproc, то есть разбить его на куски, которые легче исследовать
  3. Изолируйте любые зависимости (например, udfs) и убедитесь, что вы понимаете, что они вносят в процесс - иногда udf может дать вам понимание, которое вы не могли бы получить
2 голосов
/ 08 мая 2009

Если вы используете SQL Server, вы можете посмотреть план выполнения.

Вы также можете использовать такой инструмент, как SQLInform , чтобы переформатировать спрока, если он в плохой форме.

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

На днях в ответ на аналогичный запрос я нашел онлайновый SQL-префиксатор, который может быть вам полезен:

Выравнивание запросов Microsoft Access

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

Я согласен с Eppz. Диаграмма «сворачивание собственного» поможет вам лучше понять процедуру. Я нашел этот инструмент довольно полезным в сочетании: http://www.aivosto.com/visustin.html

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

если имеется много циклов и / или IF / ELSE, добавьте множество «PRINT 'Loop / IF X.Y'», где X - уникальное имя / номер цикла / IF по вашему выбору, а Y - уникальное местоположение в этот цикл / IF. Затем запустите процедуру из студии управления. Это даст вам быстрое представление о ходе выполнения процедуры.

Вы можете расширить эту идею и выводить локальные переменные и их значения, количество строк и т. Д. В различных местах процедуры, чтобы понять, что происходит.

если вы не уверены, как запустить его вручную, потому что не знаете, какие параметры использовать, запишите параметры. В первой строке процедуры вставьте в таблицу журнала:

INSERT INTO YourLogTable
    VALUES ('EXEC YourProcedureName @Param1='+COALESCE(''''+convert(varchar,@Param1)+'''','NULL')+', @Param2='+COALESCE(''''+convert(varchar,@Param2)+'''','NULL'))

затем вы можете запустить приложение, чтобы запустить эту процедуру, а затем вырезать / вставить из журнала и вручную запустить эту процедуру.

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

Что в этом чудовищного? Это одно огромное утверждение, много последовательных утверждений или много условных переходов к утверждениям? Для очень больших сложных операторов, я думаю, это может упростить читаемость и вывести подзапросы в CTE. Если существует много операторов или условных веток, может быть полезно вывести единицы обработки другим sprocs, в которые вызывает sproc-монстр.

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

Часто это может помочь запустить отдельные части хранимой процедуры вручную. Требуется некоторая работа, но, вероятно, поможет.

Начните с превращения хранимой процедуры в стандартный sql, удалив объявление sproc, объявив и инициализировав каждый необходимый параметр.

Запустите постепенно увеличивающуюся часть sproc и осмотрите результаты, чтобы понять, что происходит. Сделайте это путем печати переменных или временных таблиц или просто изменив вывод на экран, а не на временный источник.

И убедитесь, что вы документируете / разделяете / переписываете то, что найдете в конце - вы не хотите, чтобы кто-то еще делал то же самое, верно?

...