代码之家  ›  专栏  ›  技术社区  ›  AJ.

将多个结果行连接到单个结果中而不使用FOR XML PATH

  •  2
  • AJ.  · 技术社区  · 14 年前

    SELECT SUBSTRING((SELECT ('; ' + RTRIM(c.SomeField))
    FROM a (NOLOCK)
    INNER JOIN b (NOLOCK) ON a.aid = b.aid
    INNER JOIN c (NOLOCK) ON b.cid = c.cid
    WHERE a.zid = z.zid
    FOR XML PATH('')), 3, 1000)
    

    如果子选择中有三个结果行,则返回以下内容:

    value1; value2; value3
    

    c.SomeField

    value1 & more value1; value2; value3
    

    有没有其他方法可以将这些行结果连接在一起?如果没有,有没有一种简单的方法来解码.NET中的字符串?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Community CDub    6 年前

    来自MVP Rob Farley :

    SELECT SUBSTRING((
      SELECT ('; ' + RTRIM(c.SomeField))
      FROM a (NOLOCK)
      INNER JOIN b (NOLOCK) ON a.aid = b.aid
      INNER JOIN c (NOLOCK) ON b.cid = c.cid
      WHERE a.zid = z.zid
      FOR XML PATH(''), ROOT('xml'), TYPE
    ).value('/xml[1]','varchar(max)'), 3, 1000)
    

    但是,如果我真的将 然后我就能把里面的东西提取出来, 它把数据以自己的方式返回给我 原始(正确)表格。

        2
  •  1
  •   D'Arcy Rittich    14 年前

    您可以将这些语句作为一个批处理运行,以获得所需的内容:

    declare @s as varchar(max); 
    select @s = isnull(@s + '; ', '') + SomeField
    from (
        SELECT RTRIM(c.SomeField) as SomeField
        FROM a (NOLOCK) 
        INNER JOIN b (NOLOCK) ON a.aid = b.aid 
        INNER JOIN c (NOLOCK) ON b.cid = c.cid 
        WHERE a.zid = z.zid 
    ) a; 
    select @s as SomeFieldList; 
    

    declare @s as varchar(max);  
    select @s = isnull(@s + '; ', '') + SomeField
    from ( 
        SELECT 'aaa' as SomeField
        UNION ALL
        SELECT 'bbb' 
        UNION ALL
        SELECT 'ccc' 
    ) a;  
    select @s as SomeFieldList;