如何在STUFF函数(XML路径)中包含字符串文本?

时间:2015-07-07 18:21:40

标签: sql sql-server sql-server-2008

代码:

ISNULL(LTRIM(STUFF( (SELECT ', ' + PL.Pipe_Product
                            FROM Reporting.PipelineInformation PL
                            WHERE PL.Project_ID = TI.Project_ID 
                            FOR XML PATH('')), 1, 1, '')),'___________') AS Pipe_Product

我该怎么做?

2 个答案:

答案 0 :(得分:2)

另一种方法是将ROW_NUMBER添加到子查询中以决定是否插入逗号或者。这应该更快,因为您不会对同一个PipelineInformation表进行单独查询,这两个表都是相关的子查询。

DECLARE @PL TABLE (Pipe_Product VARCHAR(50), Project_ID INT)
INSERT @PL VALUES ('gas', 1),('oil', 1),('orange juice', 1), ('milk', 2), ('honey', 2)


SELECT
    TI.Project_ID,
    SUBSTRING((
        SELECT
            CASE WHEN RowNum = 1 THEN ' and ' ELSE ', ' END + T.Pipe_Product AS [text()]
        FROM (
            SELECT 
                Pipe_Product,
                Project_ID,
                ROW_NUMBER() OVER (ORDER BY Pipe_Product DESC) AS RowNum
            FROM @PL
            WHERE Project_ID = TI.Project_ID
            ) T
        ORDER BY RowNum DESC
        FOR XML PATH('')
    ), 3, 4000) AS [Pipe_Product]
FROM (SELECT 1 UNION ALL SELECT 2) AS TI (Project_ID)

上面的示例数据输出:

Project_ID  Pipe_Product
----------- -----------------------------
1           gas, oil and orange juice
2           honey and milk

答案 1 :(得分:1)

请改为尝试此编辑结果:

reverse(stuff(reverse(ISNULL(LTRIM(STUFF((
                    SELECT ', ' + PL.Pipe_Product
                    FROM Reporting.PipelineInformation PL
                    WHERE PL.Project_ID = TI.Project_ID
                    FOR XML PATH('')
                    ), 1, 1, '')), '___________')), charindex(' ,', reverse(ISNULL(LTRIM(STUFF((
                    SELECT ', ' + PL.Pipe_Product
                    FROM Reporting.PipelineInformation PL
                    WHERE PL.Project_ID = TI.Project_ID
                    FOR XML PATH('')
                    ), 1, 1, '')), '___________'))), 2, ' dna '))