是否有任何技巧可以阻止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&raw=1&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;”声明为“&
”?
答案 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。原因是&
字符表示实体引用的开头,例如&
。有关详细信息,请参阅XML specification。
当您的XML解析器从XML解析此字符串时,它将理解&
实体引用并以您想要的形式返回文本。因此,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;