6

私が書いたものは、テキストが存在するxmlノードに対して完全に機能するという点で、SQLフィールドを更新する際に問題に遭遇しましたが、ノードが空のときにつまずきます。

<filemeta filetype="Video">
  <heading>TEST</heading>
  <description />
</filemeta>

このコードは問題なく動作します。

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

4 に答える 4

11

このノード(/filemeta/description/text())[1]は XML に存在しないため、置き換えるものはありません。代わりに挿入を行う必要があります。空のノードと値を持つノードが混在しているシナリオがある場合は、2 つの更新ステートメントを実行する必要があります。

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 />
于 2011-06-07T06:24:15.960 に答える
2

EMPTY ノードのみを更新したいシナリオがありました。

UPDATE filemetaDB SET filemeta.modify('
    insert text{"Oh, this works!!"}
    into (/filemeta/description[not(node()) and not(text())])[1]
');

not(node()) は子がないことを意味し、not(text()) はテキスト コンテンツがないことを意味します (ただし、子を持つ可能性があるため、必要に応じてこれらのケースを組み合わせて一致させます)

于 2013-09-16T17:08:53.300 に答える
1

次のように、更新する前にノードにデータがあるかどうかを確認できます。

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
于 2011-06-06T18:57:58.560 に答える
0

この方法は、空のノードでは機能しないと思います。
また、このスレッドを確認することもできます:リンク

于 2011-06-06T18:31:12.940 に答える