如下,报的错误为:类型不匹配之间的锚和递归部分栏“routes”的递归查询“tb” 。
DECLARE @T TABLE (ID INT,start VARCHAR(20),[end] VARCHAR(20))
INSERT INTO @T(ID,start,[end])
SELECT 1,'A','B' UNION ALL
SELECT 2,'B','D' UNION ALL
SELECT 3,'E','F' UNION ALL
SELECT 4,'D','M' UNION ALL
SELECT 5,'B','K' UNION ALL
SELECT 6,'G','W';WITH tb AS
(
    SELECT
        start,
[end],
routes=start+','+[end]
    FROM @T WHERE start='B'    
    UNION ALL    
    SELECT
        A.start,
B.[end],
A.routes+','+B.start
    FROM tb AS A
        JOIN @T AS B ON A.[end]=B.start
)
SELECT * FROM tb

解决方案 »

  1.   

    DECLARE @T TABLE (ID INT,start VARCHAR(20),[end] VARCHAR(20)) 
    INSERT INTO @T(ID,start,[end]) 
    SELECT 1,'A','B' UNION ALL 
    SELECT 2,'B','D' UNION ALL 
    SELECT 3,'E','F' UNION ALL 
    SELECT 4,'D','M' UNION ALL 
    SELECT 5,'B','K' UNION ALL 
    SELECT 6,'G','W' ;WITH tb AS 

        SELECT 
            start, 
    [end], 
    routes=CAST(start+','+[end] AS VARCHAR(MAX)) 
        FROM @T WHERE start='B'    
        UNION ALL    
        SELECT 
            A.start, 
    B.[end], 
    CAST(A.routes+','+B.start AS VARCHAR(MAX)) 
        FROM tb AS A 
            JOIN @T AS B ON A.[end]=B.start 

    SELECT * FROM tb
      

  2.   

    DECLARE @T TABLE (ID INT,start VARCHAR(20),[end] VARCHAR(20)) 
    INSERT INTO @T(ID,start,[end]) 
    SELECT 1,'A','B' UNION ALL 
    SELECT 2,'B','D' UNION ALL 
    SELECT 3,'E','F' UNION ALL 
    SELECT 4,'D','M' UNION ALL 
    SELECT 5,'B','K' UNION ALL 
    SELECT 6,'G','W' ;WITH tb AS 

        SELECT 
            start, 
    [end], 
    routes=cast(start+','+[end] as varchar(8000))
        FROM @T WHERE start='B'    
        UNION ALL    
        SELECT 
            A.start, 
    B.[end], 
    A.routes+','+B.start 
        FROM tb AS A 
            JOIN @T AS B ON A.[end]=B.start 

    SELECT * FROM tb
      

  3.   

    定位点成员和递归成员的类型需要一致..所以这里将定位点的routes转换为varchar,而递归成员也转换为varchar
      

  4.   

    with中第一条select的字段长度一定要足够长。