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, в одном случае в курсоре после открытия подхватываются старые значения, в другом измененные).