10

我有这个查询:

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;

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

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

4

3 回答 3

13

使用,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

这要归功于 Rob Farley

更新:
我刚刚听说了这种新方法。我还没有彻底测试过,如果有任何反馈,我将不胜感激。我们可以像这样[text()]替换[processing-instruction(x)]

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

将返回

<?x hello & there >?>

我们只需要剥离<? ... ?>

于 2016-04-27T19:15:13.917 回答
3

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

听起来您想要做的是连接多个可以呈现给定课程的设施。您是否考虑过其他选择? 这个问题有几种可能的方法,它们在逃避你的角色方面没有问题。

于 2014-04-17T18:47:52.563 回答
1

添加到@Baodad 提供的最新解决方案中,只需REPLACE<? ... ?>.

SELECT DISTINCT
        f.CourseEventKey,
        REPLACE(
        REPLACE(
                (
                SELECT f.Title + '; ' AS [processing-instruction(x)]
                FROM Facilities
                WHERE CourseEventKey = f.CourseEventKey
                ORDER BY f.Title
                FOR XML PATH('')
                )
                , '<?x','')
                , '?>','') Facilities
FROM Facilities f`

您的输出将是:

| 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根本无法工作,因为字符将保持编码状态。

于 2018-10-03T09:09:07.163 回答