论坛首页 综合技术论坛

超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)

浏览 7382 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-20  
CREATE FUNCTION weightValue(@idValue int) RETURNS bigint AS   
BEGIN   
    DECLARE @return bigint   
    DECLARE @fatherID int  
    DECLARE @number int  
    DECLARE @menuPath VARCHAR(50)   
    DECLARE @treeLevel int  
    DECLARE @weightLevel bigint   
  
    SET @return = 0  
    SET @weightLevel = 1  
  
    SELECT @fatherID=fatherID,@menuPath=menuPath,@number=number FROM treeTable WHERE id=@idValue  
  
    SELECT @treeLevel=len(@menuPath)-len(replace(@menuPath,'/',''))   
    WHILE(@treeLevel<9) --此处9为目录层次数,经测试bigInt可以支持9级目录,再多目录层次就会出现益出   
    BEGIN   
        SET @weightLevel=@weightLevel*100  
        SET @treeLevel=@treeLevel+1  
    END   
    SET @return=@number*@weightLevel  
  
    IF(@fatherID = 1)   
    BEGIN   
        RETURN(@return)   
    END   
  
    RETURN ([dbo].weightValue(@fatherID)+@return)   
END  


当id大于32时候为什么会报这个错 
服务器: 消息 217,级别 16,状态 1,过程 weightValue,行 28
超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)。
   发表时间:2007-06-20  
你这是递归调用,每次递归都会多一次嵌套调用,
当递归次数太多时,就会超过最大嵌套层数.

其实没必要用递归调用方式的,普通循环就可以实现了.
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics