如何获取xml列中的值,当它的类型为nvarchar时

时间:2010-09-08 22:09:49

标签: sql xml

我的问题与此类似: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>

1 个答案:

答案 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。