SQL Server在生产服务器上的函数之间失败的递归调用

时间:2015-07-29 10:13:18

标签: sql sql-server recursion user-defined-functions inline-table-function

我有一个标量值函数,func-A和内联表值函数func-B。 func-A再次调用func-B和func-B调用func-A。但递归级别永远不会太深。它必须始终为2级。例如,func-A调用func-B。并且func-B再次调用func-A,这将是结束。

这在我的本地SQL Server 2008 R2上运行正常但在生产服务器上失败。错误消息显示“超出最大存储过程,功能,触发器或视图嵌套级别(限制32)。”。但奇怪的是,在生产服务器上,此问题仅发生在某些数据库实例上。有些情况下工作正常。

我如何克服这个问题? (我想我可能需要打开一些选项,比如“RECURSIVE_TRIGGERS”。)在此先感谢。

1 个答案:

答案 0 :(得分:0)

以下是诊断递归调用的一些简单步骤:

  • 使用SQL事件探查器捕获一组导致问题显示的输入。
  • 通过Management Studio连接并创建一个新的查询窗口,并执行命令/验证它失败。
  • 使用以下选项创建SQL Server Profiler会话:
    • 列过滤器 - SPID等于SSMS窗口的SPID
    • 包含事件:声明已开始
    • 包含事件:Sp:StmtCompleted

这将显示UDF中的各个语句正在执行,允许您回家路径。另一种选择是简单地编辑过程以在顶部打印参数,这样您就可以在数据级别上处理递归深度问题。