В процедурах могут использоваться следующие операторы управления:
IF <выражение>
<операторы>
[ELSE]
[IF <выражение>]
<операторы>
Если используется один оператор, то BEGIN … END не нужен.
WHILE <логическое выражение>
<операторы>
В этом операторе можно также использовать операторы BREAKи CONTINUE, которые позволяет прервать выполнение этого цикла.
CASE <переменная>
WHEN <условие1> THEN <оператор1>
WHEN <условие2> THEN <оператор2>
WHEN <условие3> THEN <оператор3>
…
ELSE <оператор>
Оператор RETURN выполняет безусловный выход из запроса или процедуры.
В программу можно включать комментарии. Однострочные комментарии отделяются от оператора двумя дефисами (--). Многострочные комментарии заключаются в символы: (/*…*/).
Для объявления переменных, которые используются в процедуре, служит директива DECLARE. Если необходимо присвоить переменной какое-либо значение, используется ключевое слово SETили SELECT. Если значение присваивается одной переменной, эти команды эквивалентны. Команда SELECTможет присваивать значения одновременно нескольким переменным. Идентификаторы переменных начинаются с символа @.
Для большинства функций используется следующий синтаксис:
имя функции(аргумент) или @@имя функции.
Например: @@TRANCOUNT возвращает число незавершенных транзакций
IF (@@TRANCOUNT>0)
RAISERROR (‘задание не может быть выполнено в транзакции’, 10,1)
Оператор RAISERROR возвращает пользовательское сообщение об ошибке, позволяет пользователям получать записи из системной таблицы sysmessages или создавать сообщение динамически, на основе заданного пользователем уровня и кода ошибки.
Синтаксис:
RAISERROR({код ошибки|символьная строка} уровень ошибки, состояние). Сообщение об ошибке можно стандартизировать и использовать многократно. Для этого сообщение следует определить в БД. Синтаксис включения сообщения в БД:
Sp_addmessage код сообщения, код важности, текст сообщения[,язык[FALSE|TRUE],REPLACE]]]
Флаг FALSE|TRUE определяет, должно ли сообщение записываться в журнал ошибок. REPLACE заменяет существующее сообщение с указанным кодом.
Функция @@ROWCOUNT возвращает количество строк, измененных последним запросом.
Например:
UPDATE STAFF SET LastName = ‘Иванов’
WHERE LastName = ‘Иванков’
IF(@@ROWCOUNT=0)
PRINT ‘Внимание : Ни одна запись не была изменена’
Операторы TRANSACT-SQL могут выполняться разными способами: по одному, пакетами, в составе хранимых процедур или триггеров, как сценарии.
Пакет – это набор операторов TRANSACT-SQL, одновременно передаваемых SQL –серверу и выполняемых как единая группа. Пакеты выполняются интерактивно или в составе сценария. Пакеты являются основой для программ SQL Server. Пакет содержит одну или несколько команд SQL. Команды пакета анализируются, компилируются и выполняются как единая группа. Если вызов хранимой процедуры не является первой командой пакета, перед именем процедуры должно стоять ключевое слово EXEC.
Обработка хранимых процедур включает ее создание и перемещение в кэш процедур – область памяти, используемую сервером для хранения скомпилированных планов выполнения сохраненной процедуры.Хранимую процедуру можно создавать в следующем порядке: сначала написать операторы Transact SQL, которые должны быть включены в хранимую процедуру, и проверить и работу, а затем, если нужный результат получен, можно создать хранимую процедуру.
Для создания хранимой процедуры используется оператор SQL CREATE PROCEDURE.
[@параметр тип данных[=значение по умолчанию] [OUTPUT]
[WITH
{ RECOMPILE
|ENCRYPTION
|RECOMPILE,ENCRYPTION}]
[FOR REPLICATION]
AS <тело процедуры>
Ключевое слово RECOMPILE определяет режим компиляции. Если RECOMPILE задано, то процедура будет перекомпилироваться всякий раз, когда она будет передаваться на выполнение (план выполнения не кэшируется, при каждом выполнении создается новый план). Ключевое слово ENCRYPTION определяет режим, при котором исходный текст хранимой процедуры не сохраняется в БД. Кроме имени все остальные параметры являются необязательными.
Каждая хранимая процедура компилируется при первом выполнении. Описание процедуры совместно с планом ее работы хранится в системных таблицах БД.