SQL Select FOR XML PATH - 合并排序并连接字符串与递增计数器

SQL Select FOR XML PATH - Combine ordering and concatenate string with increasing counter

我试图从以下SQL table

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

感谢任何帮助

您的内容需要元数据,否则输出将被格式化为 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 

您只需要对行进行排序:

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