Лучшие практики структурирования хранимых процедур

Как разработчик, пишущий в основном на C #, я применил некоторые передовые практики при написании кода на C #. Когда я иногда пишу хранимые процедуры, у меня возникают проблемы с применением этих методов к коду хранимой процедуры.

В нескольких случаях я унаследовал кошмарный код хранимой процедуры, первые три или четыре уровня хранимых процедур, настраивающие некоторые временные таблицы и в основном вызывающие друг друга . Никакой реальной работы, всего несколько строк кода. Затем, наконец, идет вызов «последней» хранимой процедуры, большого монстра из 3000-5000 строк кода SQL. В этом коде обычно много кода, пахнущего дублированием кода, сложными потоками управления (также известными как спагетти) и методом, который выполняет слишком много вещей, расположенных друг за другом, без четкого разделения, где начинается один фрагмент работы и где он заканчивается (даже не комментарий как делитель).

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

Очевидно, мои коллеги по команде также разделяют мое отсутствие хороших практик написания SQL.

] Итак ... (и вот настоящий вопрос) ... каковы хорошие практики для написания модульных поддерживаемых хранимых процедур?

Приветствуются как домашние методы, так и ссылки на книги / блоги. Методы, а также инструменты, которые помогают с определенными задачами.

Давайте резюмируем некоторые области, в которых я не нашел хороших практик

  • Модуляризация и инкапсуляция (действительно ли обмен хранимыми процедурами через временные таблицы является подходящим вариантом?)
    • В C # для этого я использую сборки, классы и методы, украшенные модификаторами доступа.
  • Отладка / тестирование (лучше, чем изменение цели отладки?)
    • Инструменты отладки?
    • Отладочные трассировки?
    • Тестовые приспособления?
  • Подчеркивание кода / логики / данных / потока управления с использованием кода структура кода
    • В C # я реорганизовываю и выделяю более мелкие методы, каждый из которых выполняет только одну логическую задачу.
  • Дублирование кода

В основном я сталкиваюсь с SQL Server как с СУБД, но ответы агностика СУБД указывают на особенности других СУБД: помощь в вышеупомянутых случаях также приветствуется.

Чтобы дать некоторую предысторию: большинство больших хранимых процедур, с которыми я столкнулся, находятся в сценариях отчетов, где в основе лежит просто создание некоторых сводных значений из большой таблицы. Но попутно вам нужно исключить некоторые значения, которые оказались в какой-то таблице исключений, добавить некоторые значения в некоторую еще не заполненную таблицу материалов, сравнить с прошлым годом (вы можете представить себе уродливый код, который обрабатывает отдел смены продуктов между годами?) и т. д.

20
задан Albin Sunnanbo 24 August 2011 в 20:18
поделиться