一下是网友帮忙写的 
--查询指定节点及其所有子节点的函数
CREATE FUNCTION f_Cid(@ID VARchar(10))
RETURNS @t_Level TABLE(ID VARchar(10),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.USRMA001,@Level
        FROM USRMA a,@t_Level b  --USRMA是写死了的
        WHERE a.USRMA004=b.ID  --USRMA004是写死了的
           AND b.Level=@Level-1
      
    END
    RETURN
END---
我想改进一下 把这个USRMA这个表名,USRMA004字段作为参数传递进去,
不知道怎么写才好?因为我发现如果直接写成类似(@ID VARchar(10))是行不通的 似乎要调用exec这个函数 但不知道怎么改进
请帮忙谢谢了

解决方案 »

  1.   

    --测试数据
    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  招远市
    --*/
      

  2.   

    换过程吧 函数体内无法调用exec