Файл с исходным кодом должен оканчиваться директивой go и последующим символом перевода строки
4.1.33 В процедуре рекомендуется наличие только одной точки выхода (один return). Для отправки в точку выхода разрешается использовать команду goto. В точке выхода рекомендуется использовать макрос RETURN_PROFILE('Имя процедуры'), который вставляет профилировку завершения процедуры и return.
4.1.34 При написании запросов с внешним соединением таблиц необходимо использовать ANSI-синтаксис (left join, inner join), см. пункт 4.3.10. Категорически запрещается использовать операторы *= и =*.
4.1.35 Не рекомендуется использование динамического формирования запросов (динамического sql), каждый факт использования должен явно согласовываться с главным архитектором системы.
4.1.36 При написании запросов с использованием union рекомендуется явно приводить типы данных, относящиеся к одной колонке, к единому варианту.
4.1.37 При раздаче полных прав (grant all) на объекты типа таблица необходимо использовать макрос _GRANT_ALL_TABLE_. Категорически запрещается раздача полных прав на процедуры и view.
4.1.38 Категорически запрещается прямое сравнение с null. Для сравнения необходимо использовать функции isnull(<выражение> , <заменяемое значение>), а также операторами is null и is not null.
4.1.39 Для создания процедур рекомендуется использовать макрос DCL_PROC_BEGIN
4.1.40 При написании запросов с использованием алиасов колонок рекомендуется использовать конструкцию <колонка> as '<алиас>'.
4.1.41 В хранимых процедурах при возврате значения в случае ошибки (если возвращается не «0»), запрещается использовать в качестве возвращаемого значения 1, 2 или другие произвольные числа. В качестве кода возврата необходимо указывать код ошибки, занесенной в скрипт retcode.sql
4.1.42 Для удаления начальных и конечных пробелов в строковых переменных или колонках необходимо использовать только макрос trim().
Для удаления начальных и(или) конечных пробелов из строки допускается использование конструкций ltrim() или rtrim() соответственно, но только вместе с проверкой на NOT NULL для данной строки (из-за разного поведения этих операторов в MSSQL и Sybase).
Пример.
Правильно | Неправильно |
select @s = isnull(ltrim(@s), ′′) select @s = trim(@s) select @s = isnull(ltrim(rtrim(@s)), ′′) | select @s = rtrim(@s) select @s = ltrim(rtrim(@s)) |
4.1.43 Если в процедуре (в запросе или в определении курсора) используются #-таблицы обязательно использование макроса M_FORCEORDER или M_KEEPPLAN. При этом обязательно должны быть проставлены все индексы на соответствующих таблицах в запросе (даже если таблица одна!). Для запросов, использующих p-таблицы, данные действия не являются обязательными, рекомендуется проставлять макрос M_KEEPPLAN при необходимости.
Обоснование:
Дело в том, что для часто- и много- обновляемых таблиц, особенно когда выключена опция автоматического обновления статистики на таблицах, MS SQL Server "думает", что план, используемый им в предыдущих случаях вызова этой же процедуры (или даже этого же запроса повторно в той же самой процедуре), устарел и его надо перестроить. Поэтому происходит перекомпиляция хранимой процедуры, что замедляет общую производительность. Это в большей степени касается #-временных таблиц и p-таблиц. Данная опция принуждает сервер использовать план, скомпилённый для данного запроса ранее, несмотря на изменение статистики, объёма данных и т.п. В этом, кстати, кроется и некоторая опасность этой опции: если в запросах не были указаны хинты, порядок и тип джойнов, то при включенной опции KEEPFIXED PLAN и первоначально неправильно построенном плане, есть риск всё время получать этот неверный план.
4.1.44 Запрещается использовать конструкцию drop table #.... внутри процедуры, поскольку такая конструкция вызывает перекомпиляцию процедуры на MS SQL Server. Кроме того, это всё равно лишено смысла, так как временные таблицы, созданные в процедуре, живут только до её конца.
4.1.45 Запрещается использовать прямые запросы (к Seed – таблицам и т.п.) для получения нового идентификатора таблицы для вставки записей, необходимо использовать только макросы.