--创建表
CREATE TABLE [tb_loc](
[id] [int],
[name] [varchar](16),
[parent] [int]
)GO--插入数据
INSERT tb_loc(id,name,parent) VALUES( 1,'河北省',NULL)
INSERT tb_loc(id,name,parent) VALUES( 2,'石家庄',1)
INSERT tb_loc(id,name,parent) VALUES( 3,'保定',1)
INSERT tb_loc(id,name,parent) VALUES( 4,'山西省',NULL)
INSERT tb_loc(id,name,parent) VALUES( 5,'太原',4)
INSERT tb_loc(id,name,parent) VALUES( 6,'新华区',2)
INSERT tb_loc(id,name,parent) VALUES( 7,'北焦村',6)
INSERT tb_loc(id,name,parent) VALUES( 8,'大郭村',6)
INSERT tb_loc(id,name,parent) VALUES( 9,'河南省',NULL)
INSERT tb_loc(id,name,parent) VALUES( 10,'大郭村南',8)
INSERT tb_loc(id,name,parent) VALUES( 11,'大郭村北',8)
INSERT tb_loc(id,name,parent) VALUES( 12,'北焦村东',7)
INSERT tb_loc(id,name,parent) VALUES( 13,'北焦村西',7)
INSERT tb_loc(id,name,parent) VALUES( 14,'桥东区',3)
INSERT tb_loc(id,name,parent) VALUES( 15,'桥西区',3)GO--创建存储过程
CREATE PROCEDURE pr_GetLocations
AS
BEGIN
WITH locs(id,name,parent,loclevel,RowIndex)
AS
(
SELECT id,name,parent,0 AS loclevel,0 AS RowIndex FROM tb_loc
WHERE parent IS NULL
UNION ALL
SELECT l.id,l.name,l.parent,loclevel+1,ROW_NUMBER() OVER(order by l.id asc) FROM tb_loc l INNER JOIN locs p
ON l.parent=p.id
)
SELECT * FROM locs order by RowIndex
END改了几次还是提示,定位点类型和递归部分的类型不匹配。
那位前辈帮我改改,谢谢

解决方案 »

  1.   

    -- 这样试试:
    CREATE PROCEDURE pr_GetLocations
    AS
    BEGIN
        SELECT t.id, t.name, t.parent, t.loclevel, t.RowIndex
        FROM 
        (
            SELECT id,name,parent,0 AS loclevel,0 AS RowIndex FROM tb_loc
            WHERE parent IS NULL
            UNION ALL
            SELECT l.id,l.name,l.parent,loclevel+1,ROW_NUMBER() OVER(order by l.id asc) FROM tb_loc l WHERE EXISTS ( SELECT 1 FROM locs p WHERE P.id=l.parent )
        ) t
        order by t.RowIndex;
    END
      

  2.   

    ALTER PROCEDURE pr_GetLocations
    AS
    BEGIN
        SELECT t.id, t.name, t.parent, t.loclevel, t.RowIndex
        FROM 
        (
            SELECT id,name,parent,0 AS loclevel,0 AS RowIndex FROM tb_loc
            WHERE parent IS NULL
            UNION ALL
            SELECT l.id,l.name,l.parent,1 AS loclevel,ROW_NUMBER() OVER(order by l.id asc) FROM tb_loc l WHERE EXISTS ( SELECT 1 FROM locs p WHERE P.id=l.parent )
        ) t
        order by t.RowIndex;
    END
      

  3.   

    --创建表
    CREATE TABLE [tb_loc](
        [id] [int],
        [name] [varchar](16),
        [parent] [int]
    )GO--插入数据
    INSERT tb_loc(id,name,parent) VALUES( 1,'河北省',NULL)
    INSERT tb_loc(id,name,parent) VALUES( 2,'石家庄',1)
    INSERT tb_loc(id,name,parent) VALUES( 3,'保定',1)
    INSERT tb_loc(id,name,parent) VALUES( 4,'山西省',NULL)
    INSERT tb_loc(id,name,parent) VALUES( 5,'太原',4)
    INSERT tb_loc(id,name,parent) VALUES( 6,'新华区',2)
    INSERT tb_loc(id,name,parent) VALUES( 7,'北焦村',6)
    INSERT tb_loc(id,name,parent) VALUES( 8,'大郭村',6)
    INSERT tb_loc(id,name,parent) VALUES( 9,'河南省',NULL)
    INSERT tb_loc(id,name,parent) VALUES( 10,'大郭村南',8)
    INSERT tb_loc(id,name,parent) VALUES( 11,'大郭村北',8)
    INSERT tb_loc(id,name,parent) VALUES( 12,'北焦村东',7)
    INSERT tb_loc(id,name,parent) VALUES( 13,'北焦村西',7)
    INSERT tb_loc(id,name,parent) VALUES( 14,'桥东区',3)
    INSERT tb_loc(id,name,parent) VALUES( 15,'桥西区',3)GO--创建存储过程
    CREATE PROCEDURE pr_GetLocations
    AS
    BEGIN
        WITH locs(id,name,parent,loclevel,RowIndex)
        AS
        (
            SELECT id,name,parent,0 AS loclevel,cast(0 as int) AS RowIndex FROM tb_loc
            WHERE parent IS NULL
            UNION ALL
            SELECT l.id,l.name,l.parent,loclevel+1,cast(ROW_NUMBER() OVER(order by l.id asc) as int) FROM tb_loc l INNER JOIN locs p
            ON l.parent=p.id
        )
        SELECT * FROM locs order by RowIndex
    END
      

  4.   

    --创建表
    CREATE TABLE [tb_loc](
        [id] [int],
        [name] [varchar](16),
        [parent] [int]
    )GO--插入数据
    INSERT tb_loc(id,name,parent) VALUES( 1,'河北省',NULL)
    INSERT tb_loc(id,name,parent) VALUES( 2,'石家庄',1)
    INSERT tb_loc(id,name,parent) VALUES( 3,'保定',1)
    INSERT tb_loc(id,name,parent) VALUES( 4,'山西省',NULL)
    INSERT tb_loc(id,name,parent) VALUES( 5,'太原',4)
    INSERT tb_loc(id,name,parent) VALUES( 6,'新华区',2)
    INSERT tb_loc(id,name,parent) VALUES( 7,'北焦村',6)
    INSERT tb_loc(id,name,parent) VALUES( 8,'大郭村',6)
    INSERT tb_loc(id,name,parent) VALUES( 9,'河南省',NULL)
    INSERT tb_loc(id,name,parent) VALUES( 10,'大郭村南',8)
    INSERT tb_loc(id,name,parent) VALUES( 11,'大郭村北',8)
    INSERT tb_loc(id,name,parent) VALUES( 12,'北焦村东',7)
    INSERT tb_loc(id,name,parent) VALUES( 13,'北焦村西',7)
    INSERT tb_loc(id,name,parent) VALUES( 14,'桥东区',3)
    INSERT tb_loc(id,name,parent) VALUES( 15,'桥西区',3)GO--创建存储过程
    CREATE PROCEDURE pr_GetLocations
    AS
    BEGIN
        WITH locs(id,name,parent,loclevel,RowIndex)
        AS
        (
            SELECT id,name,parent,0 AS loclevel,cast(0 as bigint) AS RowIndex FROM tb_loc
            WHERE parent IS NULL
            UNION ALL
            SELECT l.id,l.name,l.parent,loclevel+1,ROW_NUMBER() OVER(order by l.id asc) FROM tb_loc l INNER JOIN locs p
            ON l.parent=p.id
        )
        SELECT * FROM locs order by RowIndex
    ENDrow_number() 返回的是bigint
    但是你上面的0默认是int