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

Keh*_*mme 7 sql t-sql sql-server escaping 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
Run Code Online (Sandbox Code Playgroud)

它产生这个结果集:

CourseEventKey Facilities
-------------- -----------------------------------
29             Test Facility 1; 
30             Memphis Training Room; 
32             Drury Inn & Suites Creve Coeur;
Run Code Online (Sandbox Code Playgroud)

数据很好,但&实际上是编码的&,不适合我的目的.

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

Bao*_*dad 12

使用,TYPE).value('.','NVARCHAR(MAX)')和您的特殊字符不会被转义:

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

归功于Rob Farley.

更新:
我刚刚听说过这种新方法.我还没有彻底测试它,并希望得到任何反馈.我们可以更换[text()]使用[processing-instruction(x)],这样

select 'hello & there >' as [processing-instruction(x)] FOR XML PATH('')
Run Code Online (Sandbox Code Playgroud)

将返回

<?x hello & there >?>
Run Code Online (Sandbox Code Playgroud)

我们只需要脱掉它 <? ... ?>


mwi*_*ahl 3

我认为您必须使用 REPLACE 语句手动包装设施内联查询块以反转自动转义。

听起来您想要做的就是连接多个可以呈现给定课程的设施。您考虑过其他选择吗? 这个问题有几种可能的方法,这些方法在转义你的角色时没有问题。