我的问题与此类似:Choose a XML node in SQL Server based on max value of a child element 除了我的列不是XML类型,它的类型为nvarchar(max)。
我想从一个如下所示的列中提取XML节点值:
<Data>
<el1>1234</el1>
<el2>Something</el2>
</Data>
如何提取值'1234'和'Something'?
进行转换并使用col.nodes不起作用。 CONVERT(XML,table1.col1).value('(/ Data / el1)[1]','int')为'xcol1',
之后,我想将el1(1234)的比较值与另一列进行比较,并按原样更新更新el1。现在我正在尝试在传递更新时重建XML: 即
Update table set col1 ='<Data><el1>'+@col2+'</el1><el2>???</el2>
答案 0 :(得分:1)
您必须告诉SQL Server您所关注的节点的编号,例如:
(/Data/el1)[1]
^^^
完整示例:
declare @t table (id int, col1 varchar(max))
insert @t values (1, '<Data><el1>1234</el1><el2>Something</el2></Data>')
select CAST(col1 as xml).value('(/Data/el1)[1]', 'int')
from @t
-->
1234
SQL Server提供了modify
函数来更改XML列。但我认为您只能在xml
类型的列上使用它。这是一个例子:
declare @q table (id int, col1 xml)
insert @q values (1, '<Data><el1>1234</el1><el2>Something</el2></Data>')
update @q
set col1.modify('replace value of (/Data/el1/text())[1] with "5678"')
select *
from @q
-->
<Data><el1>5678</el1><el2>Something</el2></Data>
在一天结束时,SQL Server的XML支持使得简单的事情非常困难。如果您重视可维护性,那么最好在客户端处理XML。