SQL Server XQuery — изменение текста закрытого элемента

У меня есть столбец XML в SQL Server 2005 со следующим упрощенным XML.

+----------+------------------+
| RecordID | ValueXML         |
+----------+------------------+
| 1        | <value>x</value> |
|          |                  |
+----------+------------------+

Если я хочу изменить это значение на y, я использую следующую инструкцию SQL.

update ValueTable
set ValueXML.modify('
    replace value of (/value/text())[1]
    with ("y")')
where RecordID = 1

Это прекрасно работает. x становится y. Проблема возникает, если value не задано ничего.

update ValueTable
set ValueXML.modify('
    replace value of (/value/text())[1]
    with ("")')
where RecordID = 1

Как только это произойдет, таблица будет выглядеть так.

+----------+------------------+
| RecordID | ValueXML         |
+----------+------------------+
| 1        | <value />        |
|          |                  |
+----------+------------------+

Теперь я больше не могу установить значение. Запрос на замену значения выполняется успешно, но без изменений.

Как я могу установить текст для закрытого элемента XML? Можно ли «открыть» элемент?


person dangowans    schedule 16.05.2016    source источник


Ответы (2)


Вы не можете вставить такое значение, потому что вы пытаетесь заменить текст, но текста для замены нет, поэтому он будет выполняться, но не будет работать.

Похоже, это та же проблема, что и у вас здесь.

person BoogaWooga    schedule 16.05.2016

Спасибо @BoogaWooga за то, что указал мне правильное направление. Я смог выполнить замену в двух утверждениях.

Во-первых, я убедился, что элемент закрыт. Этот оператор работает независимо от того, закрыт элемент или нет.

update ValueTable
set ValueXML.modify('
    replace value of (/value/text())[1]
    with ("")')
where RecordID = 1

Теперь, когда я знаю, что элемент закрыт, я использую insert text для вставки значения в закрытый элемент.

update ValueTable
set ValueXML.modify('
    insert text{"x"}
    into (/value[1])')
where RecordID = 1
person dangowans    schedule 16.05.2016
comment
Привет, dangowans, я рад, что вы нашли решение, и приятно сказать спасибо @BoogaWooga. Но было бы гораздо лучше проголосовать за ответ. Голоса и принятие - это ТАК способ сказать спасибо. Пожалуйста, прочитайте это: кто-то отвечает. - person Shnugo; 17.05.2016
comment
@Shnugo Я бы проголосовал за это, однако содержание ответа не отвечало на мой вопрос. Содержание ответа говорит, что вы не можете вставить такое значение. Это правда, но вы можете вставить значение. Вам просто нужно сделать это по-другому. Я искал, что это было по-другому. - person dangowans; 17.05.2016
comment
@Shnugo Может быть, если мой ответ, который, на мой взгляд, более правильный, наберет больше голосов, или как только я смогу отметить свой ответ как правильный, я проголосую за ответы, которые мне помогли, но до тех пор я бы предпочел не подталкивать эти ответы выше, чем мои собственные. - person dangowans; 17.05.2016
comment
dangowans, очевидно, у меня другое понимание... Я голосую за очень много вкладов. Все, что я нахожу полезным, все, что добавляет что-то интересное, заслуживает моего одобрения. Другое дело — прием. Ответ, который действительно решает проблему, получает его. Если есть полезные ответы, но нет решения, я бы написал свой собственный ответ и принял это. Но все полезные вклады получают голосование. Это топливо, на котором работает SO... - person Shnugo; 17.05.2016