为愚蠢的问题道歉,但我搜索了但仍然无法找到。 (如果我只是在搜索错误的条款,添加评论,我会删除它并找到它)
长话短说:现有代码使用此代码。我们用一些我们编写的代码来扼制我们从源数据重新创建的一些XML记录。我们将其缩小到我们的代码正在转换的事实。到&
,但这导致以下查询失败,我们不明白为什么。我们正在使用一个粗糙的转换来替换&
作为一个bandaid以使其正常工作,但我宁愿让它正常工作。
这是我的代码。没有&
它就可以了。有了它,我得到'非法名字'。为什么?我正在将值提取为文本,即blah & blah
,
DECLARE @xml_doc XML, @xmlfirst XML
SET @xml_doc= '<A><B><C>blah & blah</C></B></A>'
select TOP 1 CAST (X.Y.value('./C[1]', 'varchar(max)') as xml)
FROM @xml_doc.nodes('/A/B')X(Y)
答案 0 :(得分:4)
解释
X.Y.value('(./C)[1]', 'varchar(4000)')
将&
解码回&
(这是值方法的行为)。这意味着X.Y.value('(./C)[1]', 'varchar(max)')
会返回blah & blah
。然后将blah & blah
转换为XML会生成此错误&#34;错误&#34; / exception因为blah & blah
不是有效的XML(在有效的XML中,&
应编码为&
)。
解决方案#1:如果您想获取编码的内部文本(&
)AS XML
SELECT X.Y.query('./C/text()')
FROM @xml_doc.nodes('/A/B')X(Y)
返回blah & blah
解决方案#2:如果你想获得(&
)
SELECT X.Y.value('./C[1]', 'VARCHAR(MAX)')
FROM @xml_doc.nodes('/A/B')X(Y)
返回blah & blah