如何在查询中使用FOR XML PATH('')而不转义特殊字符?

22 浏览
0 Comments

如何在查询中使用FOR XML PATH('')而不转义特殊字符?

我有这个查询:

SELECT DISTINCT
            f.CourseEventKey,
            (
                SELECT      f.Title + '; ' AS [text()]
                FROM        @Facilities
                WHERE       CourseEventKey = f.CourseEventKey
                ORDER BY    f.Title
                FOR XML PATH('')
            ) Facilities
FROM        @Facilities f

它产生以下结果集:

CourseEventKey Facilities

-------------- -----------------------------------

29 Test Facility 1;

30 Memphis Training Room;

32 Drury Inn & Suites Creve Coeur;

数据是正常的,但是&实际上是一个编码的&,对我的目的不合适。

如何修改这个查询以返回我的数据中特殊字符的原始值?

0
0 Comments

问题的原因是在使用FOR XML PATH('')查询时,特殊字符被转义,导致输出结果中的特殊字符没有被正确处理。解决方法是使用REPLACE函数来替换XML中的特殊字符。

在给出的解决方案中,将<? ... ?>进行了两次替换,第一次替换时将<?x替换为空字符串,第二次替换时将?>替换为空字符串。这样可以将XML中的特殊字符去除,得到正确的输出结果。

最终的输出结果如下所示:

| CourseEventKey | Facilities |

|----------------|--------------------------------------------|

| 29 | Test Facility 1; Test Facility 1; |

| 29 | Test Facility 33; Test Facility 33; |

| 30 | Memphis Training Room; |

| 31 | Another place; |

| 32 | Drury Inn & Suites; Drury Inn & Suites; |

| 32 | Yet Another place; Yet Another place; |

这种解决方法的原理是最终的输出结果不是XML格式,因此可以使用REPLACE函数将特殊字符去除。感谢原作者以及RoachLord的指导,他们的建议对我解决问题很有帮助。

每个人都是从零开始的,你会掌握的。

0
0 Comments

在查询中使用FOR XML PATH('')时,特殊字符会被转义,这导致了一个问题的出现。为了解决这个问题,我觉得你需要手动使用REPLACE语句来反转自动转义的操作。

根据你的需求,你想要将多个设施连接起来,这些设施可能会涉及到某个课程。你考虑过其他选项吗?这个问题中提供了几种可能的方法,这些方法不会出现转义字符的问题。

你说得对,这正是我想要做的。我会看一下那些方法,但如果有其他帮助(尤其是代码示例),我将非常感激。

对于那些刚刚找到这个问题的人,可以参考下面的解决方法,它提供了一种安全且内置的方法。

0
0 Comments

在查询中使用FOR XML PATH('')时,特殊字符会被转义,这导致问题的出现。解决方法是使用,TYPE).value('.','NVARCHAR(MAX)'),这样特殊字符就不会被转义。

SELECT DISTINCT
    f.CourseEventKey,
    (
        SELECT      f.Title + '; ' AS [text()]
        FROM        [table]
        WHERE       CourseEventKey = f.CourseEventKey
        ORDER BY    f.Title
        FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)')
    AS Facilities
FROM         f

感谢Rob Farley的贡献。

更新:

我刚听说了这种新的方法。我还没有完全测试过,非常感谢您的反馈。我们可以用[processing-instruction(x)]替换[text()],像这样:

select 'hello & there >' as [processing-instruction(x)] FOR XML PATH('')

将返回:

<?x hello & there >?>

我们只需要去掉<? ... ?>即可。

您在评论中建议注释掉<? ... ?>,但这种方法不适用于大规模的操作:sqlfiddle.com/#!18/4981ac/1/0

0