--测试数据
CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
INSERT tb SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'
GO--查询指定节点及其所有子节点的函数
CREATE FUNCTION f_Cid(@ID char(3))
RETURNS @t_Level TABLE(ID char(3),Level int)
AS
BEGIN
DECLARE @Level int
SET @Level=1
INSERT @t_Level SELECT @ID,@Level
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level
FROM tb a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
RETURN
END
GO--调用函数查询002及其所有子节点
SELECT a.*
FROM tb a,f_Cid('002') b
WHERE a.ID=b.ID
/*--结果
ID   PID  Name       
------ ------- ---------- 
002  001  烟台市
004  002  招远市
--*/
看例子写吧,老写很麻烦哦...

解决方案 »

  1.   

    我自己写出看来了create function uf_getTree(@pid varchar(30))
      returns @tree table(id varchar(30))
    as
    begin
      if @pid is null
        insert into @tree select id from tree
      else 
        declare @sql varchar(500)
        declare @id varchar(30)
        declare cur cursor for select id from tree where pid=@pid
        begin
          --set @sql='declare cur cursor for select id from tree where pid='+@pid
          --exec(@sql)
          open cur
          fetch cur into @id
          while (@@fetch_status=0)
            begin
              insert into @tree values (@id)
              insert into @tree select * from dbo.uf_getTree(@id)
              fetch cur into @id
            end
          close cur
          deallocate cur
        end
      return
    end
    go可是注释的部分为何不能用动态的处理报下面的错误服务器: 消息 443,级别 16,状态 2,过程 uf_getTree,行 13
    在函数内不正确地使用了 'EXECUTE'。
      

  2.   

    可是当我表名是动态传入的话,就只能用动态sql了。
      

  3.   

    函数内不允许 
    print
    exec太垃圾了吧
      

  4.   

    我也服了,csdn的怎么总看不全帖子呢??每次我都只能看到2楼。怎么想的??人家itpub就没有这个限制!