Обновить поле XML без текста в T-SQL - PullRequest
4 голосов
/ 06 июня 2011

Я столкнулся с проблемой обновления поля SQL в том, что то, что я написал, отлично работает для узлов xml с присутствующим текстом, однако оно отключается, когда узел пуст.* Этот код работает нормально;

UPDATE filemetaDB SET filemeta.modify('replace value of (/filemeta/heading/text())[1] with "TEST"');

Однако это ломается;

UPDATE filemetaDB SET filemeta.modify('replace value of (/filemeta/description/text())[1] with "notworking!"');

Спасибо за любую помощь.

Ответы [ 4 ]

9 голосов
/ 07 июня 2011

Этот узел (/filemeta/description/text())[1] не существует в XML, поэтому заменить его нечем.Вы должны сделать вставку вместо этого.Если у вас есть сценарий, где у вас есть смесь пустых узлов и узлов со значением, вы должны запустить два оператора обновления.

declare @filemetaDB table(filemeta xml)

insert into @filemetaDB values
('<filemeta><description>Not empty</description></filemeta>'), -- Not empty node
('<filemeta><description/></filemeta>'),                       -- Empty node
('<filemeta></filemeta>')                                      -- Missing node

-- Replace value for nodes with value
update @filemetaDB
set filemeta.modify('replace value of (/filemeta/description/text())[1] with "TEST 1"')
where filemeta.exist('/filemeta/description/text()') = 1

-- Add text node for empty nodes
update @filemetaDB
set filemeta.modify('insert text{"TEST 2"} into (/filemeta/description)[1]')
where filemeta.exist('/filemeta/description/text()') = 0

select *
from @filemetaDB

Результат:

filemeta
------------------------------------------------------
<filemeta><description>TEST 1</description></filemeta>
<filemeta><description>TEST 2</description></filemeta>
<filemeta />
2 голосов
/ 16 сентября 2013

У меня был сценарий, когда я ТОЛЬКО хотел обновить узлы ПУСТО.однако, при необходимости смешивайте и сопоставляйте эти случаи)

1 голос
/ 06 июня 2011

вы можете проверить наличие данных на узле перед обновлением, например:

IF EXISTS(
            SELECT  null
            FROM    filemetaDB
            WHERE   cast(filemeta.query('if (/filemeta/description[1]) then "T" else ""') as varchar) = 'T')
    BEGIN
        UPDATE filemetaDB SET filemeta.modify('replace value of (/filemeta/description/text())[1] with "notworking!"');
    END
0 голосов
/ 06 июня 2011

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

...