XPath в схеме обновления T-SQL - PullRequest
3 голосов
/ 17 марта 2011

В моей таблице есть столбец с данными XML.

Например, допустим, что схема выглядит следующим образом:

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

Проблема в том, что у некоторых из этих узлов есть дополнительный узел <lastname>

Теперь я хотел быобновите все элементы в этом столбце, чтобы у каждого из них был узел lastname со значением по умолчанию, например smith.

Ответы [ 2 ]

5 голосов
/ 17 марта 2011

Попробуйте что-то вроде этого:

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

0 голосов
/ 17 марта 2011

Проверить эту ссылку:

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]')

НТН

...