您必须注意Silent XQuery failures 。
这种情况下的问题是XPath表达式(/ Data/Name/text())1返回空序列。 '名字'是一个空的元素(它没有孩子)。因此表达式(/ Data/Name/text())1不指向任何现有节点。解决此问题的方法是在Name元素中插入一个新的文本节点,如下所示:
DECLARE @myDoc xml
SET @myDoc = '<Data>
<Name></Name>
<Name2>dd</Name2>
<ShortName>Joe</ShortName>
</Data>'
SELECT @myDoc
if (@myDoc.exist('(/Data/Name/text())[1]') = 1) BEGIN
set @myDoc.modify('
replace value of (/Data/Name/text())[1]
with (/Data/ShortName/text())[1]
')
end else begin
set @myDoc.modify('
insert (/Data/ShortName/text())[1]
as first into (/Data/Name)[1]
')
end
SELECT @myDoc
绝佳的提示。我确实遇到过这个问题,但忘了在帖子中提到它。 – user55474 2010-01-11 03:17:01
我很高兴你抓住了它。如果您发现它有用,请不要忘记接受这个答案。 – 2010-01-11 03:24:12