Tath SQL更新架构中的XPath

gru*_*ber 3 sql t-sql xquery sql-server-2005 xml-dml

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

例如,假设架构如下:

<person>
  <id></id>
  <name></name>
</person>
Run Code Online (Sandbox Code Playgroud)

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

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

mar*_*c_s 5

尝试这样的事情:

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

这会更新内部存在<lastname>节点的所有行,并插入这些XML值.<person><lastname>Smith</lastname>

更新:如果要选择某些名称,请使用以下查询:

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

更新#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
Run Code Online (Sandbox Code Playgroud)

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

1    <person><id>1</id><name>John</name></person>
Run Code Online (Sandbox Code Playgroud)

作为输出; 选择标准是测试值为的XML元素 <name>John