Как писать чистые хранимые процедуры SQL Server

При разработке хранимой процедуры код обычно далек от чистоты. Часто нецелесообразно разбивать код хранимой процедуры на единственную ответственность (CTE, длинные списки выбора, разбивка добавляет еще больше функций/процедур и сложности). PL/SQL предоставляет пакеты, но в SQL Server нет эквивалента, и у меня минимальный опыт работы с ними, чтобы оценить, насколько хорошо они помогают с проблемой Clean Code.

Один из моих проектов сильно зависит от хранимых процедур, многие из которых содержат более 500 строк кода.

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

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


person Greg Ogle    schedule 28.07.2014    source источник
comment
Если у вас много хранимых процедур, состоящих более чем из 500 строк, вы делаете слишком много кода в sql. Конечно, бывают случаи, когда это необходимо, но sql не заменяет программирование.   -  person Sean Lange    schedule 28.07.2014
comment
Вероятно, это так, но когда у вас есть проект, посвященный этому направлению, как вы с этим справитесь?   -  person Greg Ogle    schedule 28.07.2014
comment
Думаю, я не совсем уверен, в чем вопрос/проблема. Существует множество форматировщиков кода, которые вы можете использовать. SQLCop тоже может помочь.   -  person Sean Lange    schedule 28.07.2014
comment
Если вы просто хотите отформатировать свой код, погуглите SQL Formatter, и вы получите кучу бесплатных опций. Если вы говорите о фактической реструктуризации логики того, что вы делаете, чтобы упростить ее, я думаю, что предложение @SeanLange - ваш лучший выбор.   -  person Abe Miessler    schedule 28.07.2014
comment
Мы используем Red Gate SQL Prompt. Это здорово, но для некоторого кода это делает менее читаемым.   -  person Greg Ogle    schedule 28.07.2014
comment
@SeanLange, ты устал, так как эта длина обычна и необходима. Например, для большой сложной базы данных могут потребоваться огромные отчетные запросы. Кроме того, большая часть работы, связанной с бизнес-базой данных, выполняется вовсе не через пользовательский интерфейс, и SQL — единственный способ получить информацию для хранения данных, создания отчетов и т. д.   -  person HLGEM    schedule 28.07.2014
comment
REmeber в производительности базы данных превосходит ремонтопригодность с огромным отрывом. Большинство эффективных конструкций не так легко понять, как плохо работающие. Чистый код — это объектно-ориентированное программирование, а не программирование базы данных.   -  person HLGEM    schedule 28.07.2014


Ответы (2)


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

Я считаю, что по мере того, как вы лучше знакомитесь с моделью базы данных, вам станет легче понимать эти длинные процессы. Некоторые вещи, которые я делаю, чтобы помочь устранить неполадки позже: Если proc имеет динамический sql, всегда пишите его с режимом переменной отладки, который вы можете использовать для захвата построенного кода SQL. Это сэкономит часы времени на устранение неполадок.

Если процесс выполняет много работы, обязательно поместите его в транзакции с блоками Try Catch, чтобы все было отброшено в случае возникновения проблемы. Вы также можете воспользоваться тем фактом, что откаты не влияют на табличные переменные и сохраняют информацию об отладке и ошибках, которая вам понадобится в таблице исключений после отката. Это значительно облегчит проду, чтобы увидеть, что происходит, когда он терпит неудачу.

Старайтесь быть последовательными в своем интервале и структуре. Существуют различные инструменты, которые вы можете использовать для форматирования. И последовательное сглаживание тоже помогает. Псевдоним, на который ссылается каждое поле, потому что через 6 месяцев вы можете легко не вспомнить, из какого поля оно пришло. Лично мне намного легче понять длинные процессы, если все внутренние соединения находятся перед левыми соединениями. Это позволяет мне легко увидеть, в каких таблицах должны быть данные, и если результаты неверны, часто виновата одна из них, потому что это должно быть левое соединение.

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

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

Если у вас есть какая-то бизнес-логика, в которой, возможно, будет непросто разобраться позже, оставьте поясняющий комментарий.

Старайтесь создавать новые процедуры по разделам, чтобы вы могли легко проверять результаты по ходу дела. Так, например, предположим, что вы составляете финансовый отчет обо всех возвращенных заказах. Вы можете сначала написать cte или временную таблицу или табличную переменную, чтобы получить все результаты. Затем вы можете присоединиться к этому, чтобы получить финансовые отчеты только для этих доходов и агрегировать их. Затем, наконец, вы присоедините все это к другим деталям, которые вам нужны в отчете. Таким образом, вы можете проверить, запустив только первую часть и увидев, что за период получено 2098 возвратов. После того, как вы агрегируете финансовую информацию, у вас должна быть одна запись для каждой из этих 2098 деклараций. Затем в конце вы увидите, что у вас все еще есть все необходимые записи. Это помогает убедиться, что вы ничего не потеряли по пути, присоединяясь, если только данные не являются такими, которые вам нужны, и вы понимаете, почему вы это сделали. Вы также можете увидеть, получаете ли вы дополнительные записи от соединений с одной ко многим таблицам, которые могут быть или не быть подходящими (именно поэтому понимание модели данных имеет решающее значение).

Если вы собираетесь писать сложный sql, вам нужно прочитать несколько книг по настройке производительности (узнать, какие конструкции, такие как коррелированные подзапросы и курсоры, и что использовать вместо них), чтобы избежать использования и как убедиться, что ваши предложения where доступны для анализа. Существует несколько книг по настройке производительности SQL Server. Вам также необходимо прочитать книгу об антипаттернах SQL, которая будет гораздо полезнее, чем чистые книги по коду: https://rads.stackoverflow.com/amzn/click/com/1934356557

person HLGEM    schedule 28.07.2014
comment
Это только кажется прагматичной реальностью. SQL действительно не слишком чистый язык для начала и довольно ограничен, лучший вариант - думать о вещах функционально и делать каждую процедуру функцией базы данных. У меня есть процедуры для добавления новых строк, удаления строк, обновления строк и т. д. Затем на внешнем интерфейсе просто привяжите процедуры к вашим функциям С# CRUD или w/e, которые вы делаете. Честно говоря, я нахожу sql таким же уродливым, как vb.net, я просто использую его, потому что проще использовать базу данных sql, чем писать свою собственную базу данных. - person HumbleWebDev; 15.08.2016

На мой взгляд, вам придется найти баланс между чистым/читабельным и производительным кодом. Имеет значение и многое другое. Написание кода индивидуально — это не то же самое, что работа в команде, поэтому найдите правила именования и формата кода, применимые ко всем разработчикам.

Использование этих вещей в действиях, описанных ниже, очень помогло.

  1. Используйте четкие имена переменных, чтобы избежать «слишком» большого объема документации. FX

    DECLARE @N VARCHAR(10) = 'John' Эта переменная напрямую не говорит вам, для чего она используется.

Однако это ниже гораздо более понятно.

DECLARE @Name VARCHAR(10) = 'JOHN'
  1. Используйте ВЕРХНИЙ РЕГИСТР для встроенных функций и ключевых слов, т. е. SELECT, SUM, FROM и т. д.
  2. Только первый символ в переменной должен быть в верхнем регистре, если он не содержит более двух слов:

--Одно слово:

DECLARE @Machine VARCHAR(10)

--два слова в верхнем регистре (O и S).

DECLARE @OperatingSystem VARCHAR(10)
  1. Разделите свой код на функции (в основном встроенные в таблицу функции из-за производительности), чтобы уменьшить объем кода.

  2. Существует инструмент формата T-SQL (SQL для бедняков), который спасает жизнь. Это инструмент, который помогает очистить ваш код, выравнивая его и т. д.

  3. При работе с большими наборами данных производительность всегда стоит на первом месте после безопасности.

Я надеюсь, что это поможет вам и другим.

person user3514987    schedule 29.07.2014
comment
Хорошая точка зрения. Вы можете, по крайней мере, принять основные передовые методы, такие как соглашение об именах. - person Greg Ogle; 31.07.2014