【问题标题】:SQL Functions and RecursionSQL 函数和递归
【发布时间】:2010-10-07 06:57:11
【问题描述】:

假设您在 SQL Server 中编写了一个有条件地调用自身的函数。如果您是从头开始编写函数,完成它并尝试创建它,SQL Server 会报错。

抱怨是您从函数调用的函数不存在。当然不是,它是递归的!

要真正让它工作,你必须注释掉递归调用,创建函数,取消注释调用,然后改变函数。如果您曾经更改函数接受的参数(在这种情况下,它会抱怨您的新递归调用中的参数太多或太少),那么您必须经历这些废话。

有没有办法解决这个问题?

【问题讨论】:

  • 尽管措辞如此,但我认为这只是一个问题,有两个由同一问题引起的问题示例。
  • 它们是相关的,因为它们同时惹恼了我。不过我想我会把它们分开。

标签: sql-server-2005 recursion


【解决方案1】:

对于存储过程,您应该会收到这样的错误,您可以忽略:

无法将行添加到当前对象的 sysdepends,因为它依赖于 缺少对象“sub_proc1”。 对象仍将被创建。

对于用户定义的函数,它有点棘手,但如果你在递归调用中完全限定函数名,它就可以工作(至少在 SQL 2k8 上对我来说是这样)。

CREATE FUNCTION recursiveUDF () RETURNS int
AS
BEGIN

    DECLARE @X int

     --Fails with "recursiveUDF is not a recognized built-in function name."
    SET @X = recursiveUDF()          

     --works!
    SET @X = dbo.recursiveUDF()  

    RETURN 1
END

【讨论】:

  • 创建应该仍然有效 - 这只是一条警告消息,您可以忽略
  • 这在创建函数时起到了作用,但是,Alter 仍然失败。我认为这是我不得不忍受的烦恼。
  • 为什么不直接执行“如果存在..drop”然后“创建”而不是更改?稍微多一些努力,但没那么糟糕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 2016-02-24
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多