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

Posted

技术标签:

【中文标题】SQL Server 在生产服务器上的函数之间的递归调用失败【英文标题】:SQL Server failing recursive call between functions at production server 【发布时间】:2015-07-29 10:13:18 【问题描述】:

我有一个标量值函数 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”。)提前致谢。

【问题讨论】:

听起来您在生产中遇到了数据质量问题。如果您可以将“必须是 2 级递归”制定为业务规则,您将能够创建验证查询来查找数据异常。 【参考方案1】:

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

使用 SQL 分析器并捕获一组导致问题出现的输入。 通过 Management Studio 连接并创建一个新的查询窗口,然后执行命令/验证它失败。 使用以下选项创建 SQL Server Profiler 会话: 列过滤器 - SPID 等于 SSMS 窗口的 SPID 包含事件:语句已启动 包括事件:Sp:StmtCompleted

这将向您显示 UDF 中正在执行的各个语句,从而使您能够在路径上找到目标。另一种选择是简单地编辑过程以在顶部打印参数,从而使您能够在数据级别上解决递归深度问题。

【讨论】:

以上是关于SQL Server 在生产服务器上的函数之间的递归调用失败的主要内容,如果未能解决你的问题,请参考以下文章

sql server 和 mysql 之间的链接服务器上的分布式事务

扩展事件和 SQL Server Profiler

如何在 SQL Server 2005 实例之间传输登录和密码

SQL Server 在两个数据库之间同步数据

在生产箱上部署 Sql Server Reporting Services 报告

sql server 2012复制数据库在同一主机上的两个实例之间失败