各位大哥,能帮我解决一个问题吗?(我在sql 2005中执行下面的代码老是出现with附近有错误
功能是无限级信息查询的一部分,论坛地址为:http://topic.csdn.net/u/20100128/18/57039523-bd26-4dcb-8bbf-ef3822acee3e.html?77874

BOM  参考下:
/*----------------------------------------------
标题:SQL2005 BOM递归方法整理
(以公司组织架构为例)整理人:htl258(Tony)日期:2009.04.25(引用请保留此信息)
------------------------------------------------*/
-->创建测试环境
DECLARE @t TABLE
(
FullDept VARCHAR(20), --部门全称
Dept VARCHAR(20), --部门
ParentDept VARCHAR(20), --上级部门
Supervisor VARCHAR(20) --部门主管
)
INSERT @t SELECT 'S-IT' ,'IT','S' ,'Peter'
UNION ALL SELECT 'S-IT-CN' ,'CN','S-IT' ,'Mary' 
UNION ALL SELECT 'S-IT-CN-SH' ,'SH','S-IT-CN' ,'Jack' 
UNION ALL SELECT 'S-FS-AP' ,'AP','S-FS' ,'Colin' 
UNION ALL SELECT 'S-FS' ,'FS','S' ,'Jerry' 
UNION ALL SELECT 'S' ,'0' ,'0' ,'CiCi' 
/*
SELECT * FROM @t
--------------------
FullDept(部门全称) Dept(部门) ParentDept(上级部门) Supervisor(部门主管)
-------------------- -------------------- -------------------- --------------------
S-IT IT S Peter
S-IT-CN CN S-IT Mary
S-IT-CN-SH SH S-IT-CN Jack
S-FS-AP AP S-FS Colin
S-FS FS S Jerry
S 0 0 CiCi
(6 行受影响)
*/
-->1.使用CTE递归返回指定根的子树查询:
--->例1.查询部门主管为"Peter"的所有下级部门清单
;WITH t AS 
(
SELECT *,0 as lvl /*展开层次*/ FROM @t WHERE Supervisor = 'Peter'
UNION ALL 
SELECT a.*,b.lvl+1 FROM @t a /*原表*/ JOIN t b /*CTE*/ ON a.ParentDept = b.FullDept /*原表父项等于CTE子项*/
)
SELECT * FROM t ORDER BY FullDept;
/*
FullDept Dept ParentDept Supervisor lvl
-------------------- -------------------- -------------------- -------------------- -----------
S-IT IT S Peter 0
S-IT-CN CN S-IT Mary 1
S-IT-CN-SH SH S-IT-CN Jack 2(3 行受影响)
*/

解决方案 »

  1.   

    在Management studio中执行的还是在你的程序中执行?
      

  2.   

    可以运行的
    看你在哪里执行的?
    /*---------------------------------------------- 
    标题:SQL2005 BOM递归方法整理 
    (以公司组织架构为例) 整理人:htl258(Tony) 日期:2009.04.25(引用请保留此信息) 
    ------------------------------------------------*/ 
    -->创建测试环境 
    DECLARE @t TABLE 

    FullDept VARCHAR(20), --部门全称 
    Dept VARCHAR(20), --部门 
    ParentDept VARCHAR(20), --上级部门 
    Supervisor VARCHAR(20) --部门主管 

    INSERT @t SELECT 'S-IT' ,'IT','S' ,'Peter' 
    UNION ALL SELECT 'S-IT-CN' ,'CN','S-IT' ,'Mary' 
    UNION ALL SELECT 'S-IT-CN-SH' ,'SH','S-IT-CN' ,'Jack' 
    UNION ALL SELECT 'S-FS-AP' ,'AP','S-FS' ,'Colin' 
    UNION ALL SELECT 'S-FS' ,'FS','S' ,'Jerry' 
    UNION ALL SELECT 'S' ,'0' ,'0' ,'CiCi' 
    /* 
    SELECT * FROM @t 
    -------------------- 
    FullDept(部门全称) Dept(部门) ParentDept(上级部门) Supervisor(部门主管) 
    -------------------- -------------------- -------------------- -------------------- 
    S-IT IT S Peter 
    S-IT-CN CN S-IT Mary 
    S-IT-CN-SH SH S-IT-CN Jack 
    S-FS-AP AP S-FS Colin 
    S-FS FS S Jerry 
    S 0 0 CiCi 
    (6 行受影响) 
    */ 
    -->1.使用CTE递归返回指定根的子树查询: 
    --->例1.查询部门主管为"Peter"的所有下级部门清单 
    ;WITH t AS 

    SELECT *,0 as lvl /*展开层次*/ FROM @t WHERE Supervisor = 'Peter' 
    UNION ALL 
    SELECT a.*,b.lvl+1 FROM @t a /*原表*/ JOIN t b /*CTE*/ ON a.ParentDept = b.FullDept /*原表父项等于CTE子项*/ 

    SELECT * FROM t ORDER BY FullDept; 
    /* 
    FullDept Dept ParentDept Supervisor lvl 
    -------------------- -------------------- -------------------- -------------------- ----------- 
    S-IT IT S Peter 0 
    S-IT-CN CN S-IT Mary 1 
    S-IT-CN-SH SH S-IT-CN Jack 2 (3 行受影响) 
    */
      

  3.   

    你写在一存储过程里面试试,2005的不懂,WITH是一个相当于2000中的临时表啊
      

  4.   

    看看你的with 前面有 ; 号么?
    如果测试数据后面有GO 那不需要;
    如果没有 需要;
      

  5.   

    F大哥没有go啊。这个好像是我拷贝你的代码来的。谢谢您了。。呵呵。
      

  6.   

    你复制我2楼运行的试试?要不就是你的实例连接到2000上了
    你select @@version看看数据库版本  把结果发出来看看
      

  7.   

    你复制我2楼运行的试试?要不就是你的实例连接到2000上了
    你select @@version看看数据库版本  把结果发出来看看
      

  8.   

    各位大哥,我试过了结果对了。谢谢给位原来我是在 sql 2000上执行的。在sql 2005上是可以的。
    给位大哥我想问在sql 2000能否也实现这个功能呢?谢谢。
      

  9.   


    --函数
    -->Title:Generating test data
    -->Author:wufeng4552
    -->Date :2009-09-30 08:52:38
    set nocount on
    if object_id('tb','U')is not null drop table tb
    go
    create table tb(ID int, ParentID int)
    insert into tb select 1,0  
    insert into tb select 2,1  
    insert into tb select 3,1  
    insert into tb select 4,2  
    insert into tb select 5,3  
    insert into tb select 6,5  
    insert into tb select 7,6
    -->Title:查找指定節點下的子結點
    if object_id('Uf_GetChildID')is not null drop function Uf_GetChildID
    go
    create function Uf_GetChildID(@ParentID int)
    returns @t table(ID int)
    as
    begin
       insert @t select ID from tb where ParentID=@ParentID
       while @@rowcount<>0
       begin
          insert @t select a.ID from tb a inner join @t b
          on a.ParentID=b.id and 
          not exists(select 1 from @t where id=a.id)
       end 
    return
    end
    go
    select * from dbo.Uf_GetChildID(5)
    /*
    ID
    -----------
    6
    7
    */
    -->Title:查找指定節點的所有父結點
    if object_id('Uf_GetParentID')is not null drop function Uf_GetParentID
    go
    create function Uf_GetParentID(@ID int)
    returns @t table(ParentID int)
    as
    begin
       insert @t select ParentID from tb where ID=@ID
       while @@rowcount!=0
       begin
         insert @t select a.ParentID from tb a inner join @t b
           on a.id=b.ParentID and 
           not exists(select 1 from @t where ParentID=a.ParentID)
       end
      return
    end
    go
    select * from dbo.Uf_GetParentID(2)
    /*
    ParentID
    -----------
    1
    0
    */
      

  10.   

    --测试数据
    DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
    INSERT @t 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','小分市'--深度排序显示处理
    --生成每个节点的编码累计(相同当单编号法的编码)
    DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
    DECLARE @Level int
    SET @Level=0
    INSERT @t_Level SELECT ID,@Level,ID
    FROM @t
    WHERE PID IS NULL
    WHILE @@ROWCOUNT>0
    BEGIN
    SET @Level=@Level+1
    INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
    FROM @t a,@t_Level b
    WHERE a.PID=b.ID
    AND b.Level=@Level-1
    END--显示结果
    SELECT SPACE(b.Level*2)+'|--'+a.Name
    FROM @t a,@t_Level b
    WHERE a.ID=b.ID
    ORDER BY b.Sort
    /*--结果
    |--山东省
      |--烟台市
        |--招远市
      |--青岛市
    |--四会市
      |--清远市
        |--小分市
    --*/
      

  11.   

    F大哥,您帮俺研究研究我哪个呗,http://topic.csdn.net/u/20100130/12/e50f7546-8ce8-40f2-b1b8-015cb806c3b3.html?79005