回 帖 发 新 帖 刷新版面

主题:关于sql server中函数递归的请教

关于sql server中函数递归的请教 
我现在有一个表,如下:
(id) (名字) (上一级id)
Org_Id Org_Name Org_Parentid
……
我想建一个函数把每一条记录的最上级名字列出来。
我写的函数如下:
CREATE FUNCTION dbo.GetParentOrgan
(@i AS decimal)
RETURNS VARCHAR(40) AS 
BEGIN

declare @j decimal,@Org VARCHAR(40)
SELECT @j=Org_Parentid,@Org=Org_Name FROM Organ WHERE Org_Id = @i
IF( @j in (92001,91001,120391,120996,120521,121148,121618,91002))/*这是最上级的ID*/
RETURN @Org 
RETURN dbo.GetParentOrgan((select Org_Parentid from Organ WHERE Org_Id = @i)) 


END


运行出错提示如下:

服务器: 消息 217,级别 16,状态 1,过程 GetParentOrgan,行 10
超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)。

估计是哪里格式不对导致死循环,由于以前从来没在sqlserver写过递归,请各位高手多多指教!谢谢!

回复列表 (共2个回复)

沙发

问题还没有得到解决啊,麻烦大家帮忙想想办法拉

板凳

你是想得到最上级的Org_Name ,但我看你的程序根本没有循环。

SELECT @j=Org_Parentid,@Org=Org_Name FROM Organ WHERE Org_Id = @i
IF( @j in (92001,91001,120391,120996,120521,121148,121618,91002))/*这是最上级的ID*/
RETURN @Org 
而以上的程序只是返回你输入的Org_Name

然后因为没有循环“RETURN dbo.GetParentOrgan((select Org_Parentid from Organ WHERE Org_Id = @i)) ”这句只是返回你输入的上一级的Org_Id,而不是最上级的Org_Name 

我想应该把
SELECT @j=Org_Parentid,@Org=Org_Name FROM Organ WHERE Org_Id = @i
IF( @j in (92001,91001,120391,120996,120521,121148,121618,91002))/*这是最上级的ID*/
RETURN @Org 
RETURN dbo.GetParentOrgan((select Org_Parentid from Organ WHERE Org_Id = @i)) 

改成
while not (@i in (92001,91001,120391,120996,120521,121148,121618,91002))
begin
select @i=Org_Parentid from Organ WHERE Org_Id = @i
end
RETURN dbo.GetParentOrgan(select Org_Name from Organ where Org_Id = @i)

因为我不想建一个表,所以以上的没有测试,请测试后告知。

我来回复

您尚未登录,请登录后再回复。点此登录或注册