嵌套存储过程
当一个存储过程通过引用 CLR 例程、类型或聚合来调用另一个存储过程或执行托管代码时,存储过程将被嵌套。嵌套存储过程和托管代码引用最高可达 32 级。每当调用的存储过程或托管代码引用开始执行,嵌套级别就增加一级;执行完成后,嵌套级别就减少一级。试图超过最高 32 级的嵌套将导致整个调用链失败。正在执行的存储过程的当前嵌套级别存储在 @@NESTLEVEL 函数中。
注意 |
---|
Transact-SQL 存储过程对托管代码的任何引用均计为 32 级嵌套限制的一级。从托管代码内部调用的方法不根据此限制进行计数。 |
当存储过程通过引用 CLR 例程、类型或聚合来执行托管代码时,此引用也将计为一级嵌套。从托管代码内部调用的方法不根据此限制进行计数。可用 @@NESTLEVEL 函数返回当前的嵌套级别。当一个 CLR 存储过程通过 Microsoft SQL Server 托管访问接口执行数据访问操作时,在从托管代码到 SQL 的转换中将添加一级嵌套,这一嵌套会在 @@NESTLEVEL 函数中得到反映。
嵌套存储过程中的错误对调用存储过程来讲未必是严重的。当在存储过程中调用存储过程时,可以使用 Transact-SQL RETURN 语句返回一个返回代码,并可以在进行调用的存储过程中检查此返回代码。这样,就可以指定发生错误时存储过程的行为。有关使用返回代码的详细信息,请参阅使用返回代码返回数据。
存储过程甚至可以嵌套调用其自身,这种技术称为递归。
尽管嵌套限制为最多嵌套 32 级,但 SQL Server 对从给定的存储过程中可以调用的存储过程数量没有限制,只要从属存储过程不调用其他从属存储过程且从不超过最大嵌套级数即可。