logo

Выполнение вложенной процедуры SQL: ожидание завершения работы

Быстрый ответ

Чтобы вызвать одну хранимую процедуру из другой, воспользуйтесь оператором EXEC, указав после него имя нужной процедуры и необходимые аргументы. Пример вызова:

SQL
Скопировать код
EXEC ВложеннаяПроцедура @Параметр1, @Параметр2;

Если в РодительскаяПроцедура надо привести в действие ВложеннаяПроцедура, это будет выглядеть так:

SQL
Скопировать код
-- В теле РодительскаяПроцедура
EXEC ВложеннаяПроцедура @Значение1, @Значение2;

Не забывайте об обязательном соответствии типов и последовательности параметров, чтобы избежать возникновения ошибок при работе с SQL.

Обеспечение последовательности выполнения

T-SQL, как правило, не подразумевает асинхронное выполнение операций, поэтому РодительскаяПроцедура будет ждать окончания ВложеннаяПроцедура перед тем, как продолжить свою работу.

SQL
Скопировать код
-- В теле РодительскаяПроцедура
EXEC ВложеннаяПроцедура @Значение1, @Значение2;
-- Здесь РодительскаяПроцедура в ожидании завершения работы ВложеннаяПроцедура

Это свойство облегчает поддержку очерёдности и целостности операций, подобно движению машин в потоке в час-пик.

Работа с параметрами и результатами

Передача параметров

Необходимо обращать внимание на корректность передачи параметров при вызове ВложеннаяПроцедура:

SQL
Скопировать код
-- Создание РодительскаяПроцедура
CREATE PROCEDURE РодительскаяПроцедура @РодительParam1 INT, @РодительParam2 INT AS
BEGIN
  ...
  EXEC ВложеннаяПроцедура @ДочернийParam1 = @РодительParam1, @ДочернийParam2 = @РодительParam2;
  ...
END;

Получение результата

Для того чтобы получить результат работы вложенной хранимой процедуры, можно использовать следующую конструкцию:

SQL
Скопировать код
DECLARE @Результат INT;

-- Выполнение хранимой процедуры и перехват её результата
EXEC ВложеннаяПроцедура @Входное значение, @Результат OUTPUT;

SELECT @Результат AS 'Выходное значение';

Такой подход создаёт ощущение какой-то магии, словно из шляпы вытаскивают кролика!

Визуализация

Можно представить себе наложенные друг на друга матрёшки:

Markdown
Скопировать код
           [🪆 Самая большая кукла (Родительская Процедура)]
                  /         \
            /                     \
[🪆 Меньшая кукла (Вложенная Процедура)]  [🪆 Меньшая кукла (Вложенная Процедура)]

Сначала видна большая матрёшка, а внутри неё находятся сразу несколько меньших.

Python
Скопировать код
EXEC ГлавнаяПроцедура
BEGIN
  -- Здесь мы открываем вложенные матрёшки
  EXEC ВложеннаяПроцедура1
  EXEC ВложеннаяПроцедура2
  -- И самая маленькая обнаруживается последней!
END

Принципы работы и рекомендации

Управление транзакциями

Управление транзакциями при вложении процедур схоже с акробатическим номером. Вот как можно сохранить равновесие:

SQL
Скопировать код
BEGIN TRANSACTION;

BEGIN TRY
  EXEC ВложеннаяПроцедура;
  COMMIT TRANSACTION;
END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION;
  PRINT 'Возникла ошибка.';
  -- Здесь следует обработать исключение
END CATCH;

Передача информации об ошибках

Важно обеспечить правильную передачу информации об ошибках от дочерней процедуры к родительской:

SQL
Скопировать код
-- Внутри ВложеннаяПроцедура
BEGIN TRY
  -- Здесь должны быть действия процедуры
END TRY
BEGIN CATCH
  THROW;  -- Передача информации об ошибке РодительскойПроцедуре
END CATCH;

-- Внутри РодительскаяПроцедура
BEGIN TRY
  EXEC ВложеннаяПроцедура;
END TRY
BEGIN CATCH
  -- Разбор и обработка ошибки, полученной от ВложеннаяПроцедура
  PRINT 'Ошибка передана от ВложеннаяПроцедура.';
END CATCH;

Условное выполнение

Иногда необходимость вызова процедуры определяется выполнением определённого условия:

SQL
Скопировать код
IF @Условие = TRUE
BEGIN
  EXEC ВложеннаяПроцедура;
END

Полезные материалы

  1. Запуск хранимой процедуры – SQL Server | Microsoft Learn — Подробная инструкция по запуску хранимых процедур в SQL Server.
  2. Вложение хранимых процедур – SQLServerCentral — Советы и рекомендации по оптимальному вложению хранимых процедур.
  3. Обработка ошибок в SQL Server 2012 – Simple Talk — Методики и доступы к обработке возникающих ошибок в рамках хранимых процедур.