Выполнение вложенной процедуры SQL: ожидание завершения работы
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы вызвать одну хранимую процедуру из другой, воспользуйтесь оператором EXEC
, указав после него имя нужной процедуры и необходимые аргументы. Пример вызова:
EXEC ВложеннаяПроцедура @Параметр1, @Параметр2;
Если в РодительскаяПроцедура
надо привести в действие ВложеннаяПроцедура
, это будет выглядеть так:
-- В теле РодительскаяПроцедура
EXEC ВложеннаяПроцедура @Значение1, @Значение2;
Не забывайте об обязательном соответствии типов и последовательности параметров, чтобы избежать возникновения ошибок при работе с SQL.
Обеспечение последовательности выполнения
T-SQL, как правило, не подразумевает асинхронное выполнение операций, поэтому РодительскаяПроцедура
будет ждать окончания ВложеннаяПроцедура
перед тем, как продолжить свою работу.
-- В теле РодительскаяПроцедура
EXEC ВложеннаяПроцедура @Значение1, @Значение2;
-- Здесь РодительскаяПроцедура в ожидании завершения работы ВложеннаяПроцедура
Это свойство облегчает поддержку очерёдности и целостности операций, подобно движению машин в потоке в час-пик.
Работа с параметрами и результатами
Передача параметров
Необходимо обращать внимание на корректность передачи параметров при вызове ВложеннаяПроцедура
:
-- Создание РодительскаяПроцедура
CREATE PROCEDURE РодительскаяПроцедура @РодительParam1 INT, @РодительParam2 INT AS
BEGIN
...
EXEC ВложеннаяПроцедура @ДочернийParam1 = @РодительParam1, @ДочернийParam2 = @РодительParam2;
...
END;
Получение результата
Для того чтобы получить результат работы вложенной хранимой процедуры, можно использовать следующую конструкцию:
DECLARE @Результат INT;
-- Выполнение хранимой процедуры и перехват её результата
EXEC ВложеннаяПроцедура @Входное значение, @Результат OUTPUT;
SELECT @Результат AS 'Выходное значение';
Такой подход создаёт ощущение какой-то магии, словно из шляпы вытаскивают кролика!
Визуализация
Можно представить себе наложенные друг на друга матрёшки:
[🪆 Самая большая кукла (Родительская Процедура)]
/ \
/ \
[🪆 Меньшая кукла (Вложенная Процедура)] [🪆 Меньшая кукла (Вложенная Процедура)]
Сначала видна большая матрёшка, а внутри неё находятся сразу несколько меньших.
EXEC ГлавнаяПроцедура
BEGIN
-- Здесь мы открываем вложенные матрёшки
EXEC ВложеннаяПроцедура1
EXEC ВложеннаяПроцедура2
-- И самая маленькая обнаруживается последней!
END
Принципы работы и рекомендации
Управление транзакциями
Управление транзакциями при вложении процедур схоже с акробатическим номером. Вот как можно сохранить равновесие:
BEGIN TRANSACTION;
BEGIN TRY
EXEC ВложеннаяПроцедура;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
PRINT 'Возникла ошибка.';
-- Здесь следует обработать исключение
END CATCH;
Передача информации об ошибках
Важно обеспечить правильную передачу информации об ошибках от дочерней процедуры к родительской:
-- Внутри ВложеннаяПроцедура
BEGIN TRY
-- Здесь должны быть действия процедуры
END TRY
BEGIN CATCH
THROW; -- Передача информации об ошибке РодительскойПроцедуре
END CATCH;
-- Внутри РодительскаяПроцедура
BEGIN TRY
EXEC ВложеннаяПроцедура;
END TRY
BEGIN CATCH
-- Разбор и обработка ошибки, полученной от ВложеннаяПроцедура
PRINT 'Ошибка передана от ВложеннаяПроцедура.';
END CATCH;
Условное выполнение
Иногда необходимость вызова процедуры определяется выполнением определённого условия:
IF @Условие = TRUE
BEGIN
EXEC ВложеннаяПроцедура;
END
Полезные материалы
- Запуск хранимой процедуры – SQL Server | Microsoft Learn — Подробная инструкция по запуску хранимых процедур в SQL Server.
- Вложение хранимых процедур – SQLServerCentral — Советы и рекомендации по оптимальному вложению хранимых процедур.
- Обработка ошибок в SQL Server 2012 – Simple Talk — Методики и доступы к обработке возникающих ошибок в рамках хранимых процедур.