Вложенные хранимые процедуры
Вложенностью называют ситуацию, когда хранимая процедура вызывает другую процедуру или выполняет управляемый код, ссылаясь на подпрограмму, тип или статистическую функцию среды CLR. Вложенность хранимых процедур и ссылок на управляемый код ограничена 32 уровнями. Уровень вложенности увеличивается на единицу, когда вызванная хранимая процедура или управляемый код начинает выполняться, и уменьшается на единицу, когда заканчивает. Если уровень вложенности превышает максимальное значение, вся цепочка вызовов заканчивается ошибкой. Текущий уровень вложенности хранимых процедур можно получить при помощи функции @@NESTLEVEL.
![]() |
---|
Любая ссылка на управляемый код внутри хранимой процедуры Transact-SQL считается одним уровнем вложенности. Методы, вызванные из управляемого кода, не учитываются в ограничении на 32 уровня вложенности. |
Если хранимая процедура выполняет управляемый код, ссылаясь на подпрограмму, тип или статистическую функцию среды CLR, эта ссылка считается одним уровнем вложенности. Методы, вызванные из управляемого кода, не учитываются в ограничении на 32 уровня вложенности. Текущий уровень вложенности можно получить при помощи функции @@NESTLEVEL. Когда хранимая процедура CLR обращается к данным через управляемого поставщика Microsoft SQL Server, для передачи данных из управляемого кода в SQL добавляется дополнительный уровень вложенности, который учитывается функцией @@NESTLEVEL.
Ошибка во вложенной хранимой процедуре не обязательно должна быть неисправимой для вызывающей хранимой процедуры. При вызове одной хранимой процедуры из другой используйте инструкцию Transact-SQL RETURN и проверяйте код возврата в вызывающей хранимой процедуре. Таким образом можно управлять поведением хранимой процедуры при возникновении ошибок. Дополнительные сведения об использовании кодов возврата см. в разделе Возврат данных с использованием кода возврата.
Хранимые процедуры могут вызывать сами себя, этот способ называется рекурсией.
Несмотря на ограничение в 32 уровня вложенности, SQL Server не ограничивает количество хранимых процедур, которые можно вызвать из некоторой процедуры, если они не вызывают другие процедуры и уровень вложенности не превышает 32 уровня.