По сути, Stored Procedure — это сохранённый набор SQL-инструкций внутри базы данных. Написал один раз, потом вызываешь сколько угодно раз.
Сегодня разобрал три вещи:
• IF / ELSE
• Обработку ошибок
• Нормальный стиль написания процедур
1. IF / ELSE
Stored Procedures умеют принимать решения.
Логика такая же, как в обычном коде:
IF условие
выполнить действие
ELSE
выполнить другое действие
Например, проверить, сдал студент экзамен или нет:
IF @Score >= 50
PRINT 'You passed!';
ELSE
PRINT 'You failed.';
Точно так же можно проверять:
право голоса по возрасту;
наличие товара на складе;
скидки для клиентов;
права администратора;
любые бизнес-правила.
Теперь стало понятно, что
IF ELSE — это основной способ управлять логикой внутри процедуры.2. Обработка ошибок
Рано или поздно что-то ломается:
деление на ноль;
дубликаты данных;
обновление несуществующих записей;
ошибки во время денежных переводов.
Для таких случаев в SQL Server есть:
BEGIN TRY
-- основной код
END TRY
BEGIN CATCH
-- обработка ошибки
END CATCH
Пример:
BEGIN TRY
SELECT @Number1 / @Number2;
END TRY
BEGIN CATCH
PRINT 'Division by zero.';
END CATCH
Полезная штука:
ERROR_MESSAGE()
Позволяет получить текст реальной ошибки:
PRINT ERROR_MESSAGE();
Ещё посмотрел на транзакции.
Идея простая:
либо выполняются все операции, либо не выполняется ни одна.
Для денежных переводов это критично.
Если одна из операций упала:
ROLLBACK TRANSACTION;
База откатит изменения и не останется в промежуточном состоянии.
3. Стиль написания Stored Procedures
SQL быстро превращается в кашу, если писать как попало.
Плохой вариант:
create procedure getstudents as begin select * from students end
Нормальный вариант:
CREATE PROCEDURE GetStudents
AS
BEGIN
SELECT *
FROM Students;
END;
Что стоит соблюдать:
понятные названия процедур;
понятные названия параметров;
SQL-ключевые слова в верхнем регистре;
отступы;
комментарии только там, где они реально нужны;
аккуратная структура кода.
Ещё узнал про:
SET NOCOUNT ON;
Эта команда отключает лишние сообщения вида:
(1 row affected)
Мелочь, но в рабочих процедурах её почти всегда добавляют.
Маленькая тема, но без неё сложно писать серьёзные процедуры и автоматизировать работу с данными.
👉 @SQLPortal