如何在查询中使用FOR XML PATH('')而不转义特殊字符?
如何在查询中使用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;
数据是正常的,但是&
实际上是一个编码的&
,对我的目的不合适。
如何修改这个查询以返回我的数据中特殊字符的原始值?
问题的原因是在使用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的指导,他们的建议对我解决问题很有帮助。
每个人都是从零开始的,你会掌握的。
在查询中使用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