如何在SQL 2005上使用FOR XML PATH时保留&符号(&)

时间:2008-11-07 01:12:25

标签: sql xml sql-server-2005

是否有任何技巧可以阻止SQL Server授权像&,<和>这样的字符?我正在尝试在我的XML文件中输出一个URL,但SQL想要替换任何'&'使用“&

采取以下查询:

SELECT 'http://foosite.com/' + RTRIM(li.imageStore)
        + '/ImageStore.dll?id=' + RTRIM(li.imageID)
        + '&raw=1&rev=' + RTRIM(li.imageVersion) AS imageUrl
FROM ListingImages li
FOR XML PATH ('image'), ROOT ('images'), TYPE

我得到的输出是这样的(& s有权):

<images>
  <image>
    <imageUrl>http://foosite.com/pics4/ImageStore.dll?id=7E92BA08829F6847&amp;raw=1&amp;rev=0</imageUrl>
  </image>
</images>

我想要的是这个(&amp; s没有权利):

<images>
  <image>
    <imageUrl>http://foosite.com/pics4/ImageStore.dll?id=7E92BA08829F6847&raw=1&rev=0</imageUrl>
  </image>
</images>

如何阻止SQL服务器将“&amp;”声明为“&amp;”?

3 个答案:

答案 0 :(得分:53)

在某些情况下,某人可能不需要格式良好的XML - 我(也许是原始海报)遇到的是使用For XML Path技术通过递归查询返回“子”项的单个字段列表。有关此技术的更多信息(请参阅“黑盒XML方法”部分): Concatenating Row Values in Transact-SQL

对于我的情况,看到'H&amp; E'(一种病理染色)转变为'格式良好的XML'真的令人失望。幸运的是,我找到了一个解决方案...以下页面帮助我相对容易地解决了这个问题,并且没有重新设计我的递归查询或在演示级别添加额外的解析(对于这个以及我孩子的其他/未来情况) -rows数据字段包含保留的XML字符):Handling Special Characters with FOR XML PATH


编辑:参考博客文章下面的代码。

select
  stuff(
     (select ', <' + name + '>'
     from sys.databases
     where database_id > 4
     order by name
     for xml path(''), root('MyString'), type
     ).value('/MyString[1]','varchar(max)')
   , 1, 2, '') as namelist;

答案 1 :(得分:10)

SQL Server生成的内容是正确的。您期望看到的不是格式良好的XML。原因是&字符表示实体引用的开头,例如&amp;。有关详细信息,请参阅XML specification

当您的XML解析器从XML解析此字符串时,它将理解&amp;实体引用并以您想要的形式返回文本。因此,XML文件中的内部格式不应该对您造成问题,除非您使用错误的XML解析器,或尝试手动解析它(在这种情况下,您当前的解析器代码目前在XML方面实际上是错误的规范)。

答案 2 :(得分:4)

试试这个......

select 
  stuff( 
     (select ', <' + name + '>' 
     from sys.databases 
     where database_id > 4 
     order by name 
     for xml path(''), root('MyString'), type 
     ).value('/MyString[1]','varchar(max)') 
   , 1, 2, '') as namelist;