Tath SQL更新架构中的XPath

时间:2011-03-17 11:15:22

标签: sql sql-server-2005 tsql xquery xml-dml

在我的表格中,我有一个包含XML数据的列。

例如,假设架构如下:

<person>
  <id></id>
  <name></name>
</person>

问题是其中一些节点有额外的节点<lastname>

现在,我想更新此列中的所有元素,以便每个元素都具有默认值的节点lastname,例如smith

2 个答案:

答案 0 :(得分:5)

尝试这样的事情:

UPDATE 
    dbo.YourTable
SET 
    XmlColumn.modify('insert <lastname>Smith</lastname> as last into (/person)[1]')
WHERE 
    XmlColumn.exist('/person/lastname') = 0

这会更新<lastname><person>节点的所有行,并将<lastname>Smith</lastname>插入这些XML值。

更新:如果您想选择某些名称,请使用此查询:

UPDATE 
    dbo.YourTable
SET 
    XmlColumn.modify('insert <lastname>Smith</lastname> as last into (/person)[1]')
WHERE 
    XmlColumn.exist('/person[name="John"]') = 1

更新#2:以证明我的查询是正确的 - 在此尝试此小测试:

DECLARE @test TABLE (ID INT, XmlCol XML)

INSERT INTO @test 
   VALUES(1, '<person><id>1</id><name>John</name></person>'),
         (2, '<person name="John"><id>2</id><name>Fred</name></person>'),
         (3, '<person><id>3</id><name>Wally</name></person>')

SELECT *
FROM @test
WHERE XmlCol.exist('/person[name="John"]') = 1

如果你运行它(在SQL Server 2008或更高版本上),你将得到:

1    <person><id>1</id><name>John</name></person>

作为输出;选择标准是对 XML元素 <name>进行测试,其值为John

答案 1 :(得分:0)

点击此链接:

http://msdn.microsoft.com/en-us/library/ms345117%28SQL.90%29.aspx

在那里你可以找到:

UPDATE docs SET xCol.modify('
  insert 
   <section num="2">   
        <title>Background</title>
   </section>
  after (/doc//section[@num=1])[1]')

HTH