【问题标题】:SQL Select FOR XML PATH - Combine ordering and concatenate string with increasing counterSQL Select FOR XML PATH - 将排序和连接字符串与递增计数器组合
【发布时间】:2021-10-13 12:55:53
【问题描述】:

我正在尝试从下面的 SQL 表中获取

CODE , FILENAME     , ORDER
xxxx , Noimage.jpg  , 0 
xxxx , yyyy.jpg     , 2
xxxx , zzzz.jpg     , 1
xxxx , aaaa.jpg     , 3

以下结果 --> p1=zzzz.jpg&p2=yyyy.jpg&p3=aaaa.jpg

我试过了

SELECT STUFF((SELECT '&' + FILENAME
            FROM MYTABLE
            WHERE IMAGEORDER<>0
            FOR XML PATH('')) ,1,1,'') AS Txt 

但我不知道如何结合排序和基于排序来连接 p1、p2、p3

感谢任何帮助

【问题讨论】:

    标签: sql for-xml-path


    【解决方案1】:

    您只需要对行进行排序:

    DECLARE @t TABLE (Code VARCHAR(255), Filename VARCHAR(255), ImageOrder INT)
    
    INSERT INTO @t VALUES
    ('xxxx', 'Noimage.jpg', 0),
    ('xxxx', 'yyyy.jpg', 2),
    ('xxxx', 'zzzz.jpg', 1),
    ('xxxx', 'aaaa.jpg', 3)
     
    SELECT REPLACE(
      (SELECT CAST('&p' + CAST(ImageOrder AS varchar) + '=' + Filename AS VARCHAR(MAX))
      FROM @t
      WHERE ImageOrder <> 0
      ORDER BY ImageOrder
      FOR XML PATH (''))
      , 'amp;', '') AS Txt
    

    这会给你结果:

    &p1=zzzz.jpg&p2=yyyy.jpg&p3=aaaa.jpg
    

    【讨论】:

    • 非常感谢,但是前面的 '&' 呢?我想避免它的唯一方法是在上述所有内容中使用类似 substring(txt,1,len(txt)-1) 的东西..正确吗?
    【解决方案2】:

    你的东西需要元数据,否则输出将被格式化为 xml。此外,如果您使用的是 2016+ 版本,则可以使用 STUFF() 函数来实现相同的功能。我添加了一个归一化 CTE,以添加基于 IMAGEORDER 计算的 P1,P2..PX 值。

    ;WITH Normalized AS
    (
        SELECT      
            '&P'+CAST(ROW_NUMBER() OVER (ORDER BY IMAGEORDER) AS NVARCHAR(10))+'='+FILENAME AS Item,
            IMAGEORDER
        FROM
            MYTABLE
        WHERE
            IMAGEORDER<>0
    )
    
    
    SELECT STUFF((SELECT Item
                FROM Normalized ORDER BY IMAGEORDER             
                FOR XML PATH(''), TYPE).value('.','varchar(max)') ,1,1,'') AS Txt 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2021-06-07
      • 2015-07-01
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多