Начало и конец многострочного комментария должны начинаться с первой позиции. Для комментирования одной строки необходимо использовать однострочный комментарий

4.1.17 При написании исходного кода не рекомендуется использование оператора goto (кроме случая перехода на единственную точку выхода).

Определение переменных должно производится в начале процедуры. Переменные должны располагаться одна под другой и с одной и той же колонки. Типы переменных также должны начинаться с одной и той же колонки.

Пример.

Правильно Неправильно
declare @RetVal int, @ObjectID DSIDENTIFIER declare @RetVal int, @ObjectID DSIDENTIFIER declare @RetVal int, @i int

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

Пример.

Правильно Неправильно
fetch MyCursor into @ID, @Value fetch MyCursor into @ID, @Value

В случае если вызов оператора fetch с указанными параметрами и отступами не превышает 80 символов, допускается написание оператора и списка параметров в одну строчку.

4.1.21 Категорически запрещается прямая ссылка на ID в исходных текстах, включая именованные константы, кроме случаев заполнения таблиц скриптами, входящими в комплект поставки ПО. Такие как:

a. Property.sql – tProperty

b. IntObj.sql – tInterfaceObject и т.д.

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

4.1.23 Добавление новых параметров процедуры осуществляется только в конец списка параметров, т.е. после уже существующих параметров.
Определение необязательных параметров хранимых процедур должно идти только вида @Param type = null. Категорически запрещается использование других вариантов.

Не рекомендуются рекурсивные вызовы процедур (для борьбы с неконтролируемым возрастанием уровня вложенности).

4.1.25 Каждая процедура обязательно должна начинаться макросом PROFILE_BEGIN_EX('Имя процедуры - start [доп. текст]'), а перед любой командой return должен стоять PROFILE_END_EX('Имя процедуры - finish [end] [доп. текст]'). Значения входных параметров, до их изменения, рекомендуется выводить макросом вида PROFILE_TIME_VAR... Любые потенциально сложные запросы рекомендуется отмечать макросом вида PROFILE_TIME... Допускается вместо указанных, использовать макросы, содержащие перечисленные. (отладочные цели, замер производительности).
Более предпочтительно использовать в начале процедуры макрос BEGIN_PROC, _а в конце процедуры - END_PROC, которые включают в себя макросы старта и окончания профилировки процедуры.
Для поддержки нового механизма run-time логгирования в хранимых процедурах рекомендуется в сложных точках алгоритма и потенциально ошибочных местах использовать макросы дополнительного логгирования: M_LOG_INFO (вывод доп. информации), M_LOG_ERROR (информация об ошибке) и M_LOG_DEBUG (отладочная информация, если включен режим отладки)

Обязателен макрос M_FORCEPLAN в начале любой процедуры. Порядок таблиц во from должен быть таким, как если бы всегда включен режим set forceplan on. Также запрещается отключать подавление плана макросом M_FORCEPLAN_OFF или явно set forceplan off. (ошибки оптимизатора, подавленный план в вызывающей процедуре и, соответственно неправильный порядок соединения таблиц из-за отключенного оптимизатора)

4.1.27 В командах UPDATE и DELETE, если изменяемая таблица не стоит первой в секции FROM и используется макрос M_FORCEORDER, необходимо для соединения таблиц использовать ANSI-стандарт (inner join). Категорически запрещается указывать макрос M_FORCEORDER в командах UPDATE и DELETE, если таблица, в которой изменяются/удаляются данные, прописана в секции FROM и не стоит в ней первой при использовании не-ANSI синтаксиса. (В MS SQL (только при включенной опции FORCE ORDER !) при таком написании первой всегда считается таблица, к которой применяется операция UPDATE/DELETE, несмотря на её положение во FROM).

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

4.1.29 Категорически запрещается явное указание команд set forceplan on/off (Перекомпиляция процедур на MS SQL).

4.1.30 Категорически запрещается использование однострочного комментария в последней (или единственной) строке определения макроса (Если в строке, где используется макрос, есть последующий код, то он окажется закомментированным).

4.1.31 Категорически запрещается изменять значения переменных, использованных в объявлении курсора (например в секции WHERE) на всём интервале кода от команды DECLARE CURSOR до команды OPEN <курсор> (разное поведение Sybase и MS SQL, в одном случае в курсоре после открытия подхватываются старые значения, в другом измененные).

Наши рекомендации