【问题标题】:SQL Error: Maximum stored procedure, function, trigger, or view nesting level exceededSQL 错误:超出最大存储过程、函数、触发器或视图嵌套级别
【发布时间】:2015-07-02 15:18:35
【问题描述】:

我想根据我选择的日期显示数据,[fnDateTxtToWeekNum] 会返回我选择的日期的 weeknum,weeknum 是 [fnBenchmarkData] 的一个参数,所有可用的 weeknum 信息都存储在 dbo.Weeks 表中。

我收到此错误:

"最大存储过程、函数、触发器或视图嵌套级别 超过(限制 32)。”

SELECT  p.weeknum, p.date, q.ID, q.score
FROM dbo.Weeks AS p 
cross apply
[dbo].fnBenchmarkData(p.weeknum) as q 
where weeknum = [dbo].[fnDateTxtToWeekNum]('2015-07-02')

是不是因为我引用了 weeknum 两次并且函数自己调用它? fnBenchmarkData 上的 @weeknum 引用 dbo.weeks(基本上如果没有 where 子句,此 SQL 将返回所有周的所有数据)。然后我使用 fnDateTxtToWeeknum,它会返回一个星期数,基本上我创建了一个过滤器,因此 SQL 将只显示我需要的特定星期的数据(将我输入的日期转换为星期数)。

/* 我需要最终输出同时包含周数、日期、ID 和分数。 fnBenchmarkData 本身不会返回 weeknum 和日期信息,这就是我需要使用交叉应用的原因。 */

【问题讨论】:

  • 可以肯定的是,通过让函数自己调用,您已经设置了一个无限循环,除非您未显示的代码的某些部分会破坏循环。
  • @TabAlleman 这没有任何意义,最后一行如果我只使用 where weeknum = 777,SQL 将只返回第 777 周的数据。我所做的唯一更改是添加一个函数将我输入的日期转换为 777,仍然不明白为什么它是无限循环。
  • 无法从您发布的 sn-p 中分辨出来。您需要发布这两个函数的完整代码。

标签: sql sql-server function tsql where


【解决方案1】:

我会说问题可能存在于函数内部。你在函数内部使用递归吗?如果你是你可能会考虑使用一个while循环来摆脱它。看起来您在这里遇到了递归问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2022-07-20
    • 1970-01-01
    • 2016-10-14
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多