Попробуйте что-то вроде этого:
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