4

XML 列を含むテーブルがあり、xml を更新して属性を挿入するか、属性が既に存在する場合は属性値を変更したいと考えています。

開始 xml が次のようであるとしましょう: < d />

挿入:

UPDATE Table 
set XmlCol.modify('insert attribute att {"1"} into /d[1]')

変化:

UPDATE Table
set XmlCol.modify('replace value of /d[1]/@att with "1"')

属性が既に存在する場合、insert は失敗し、属性が存在しない場合、replace は失敗します。「if」を使用しようとしましたが、うまくいかないと思います。「XQuery [modify()]:「属性」付近の構文エラー、「else」が必要です。」

IF試行

UPDATE Table 
set XmlCol.modify('if empty(/d[1]/@att) 
                   then insert attribute att {"1"} into /d[1]
                   else replace value of /d[1]/@att with "1"')

現在、xml を変数に選択し、T-SQL を使用してそれを変更し、新しい xml で列を更新します。これには、トランザクションで行をロックする必要があり、おそらく DB のコストが高くなります。

4

2 に答える 2

4

私が知る限り、単一のステートメントでこれを行うことはできません。exist() メソッドを使用して、2 つの update ステートメントでそれを実現できます。

DECLARE @TestTable TABLE
(
    Id int,
    XmlCol xml
);

INSERT INTO @TestTable (Id, XmlCol)
VALUES
    (1, '<d att="1" />'),
    (2, '<d />'),
    (3, '<d att="3" />');

SELECT * FROM @TestTable;

UPDATE @TestTable
SET XmlCol.modify('replace value of /d[1]/@att with "1"')
WHERE XmlCol.exist('(/d[1])[not(empty(@att))]') = 1;

UPDATE @TestTable
SET XmlCol.modify('insert attribute att {"1"} into /d[1]')
WHERE XmlCol.exist('(/d[1])[empty(@att)]') = 1;

SELECT * FROM @TestTable;

最終的な選択からの出力は次のとおりです。

Id          XmlCol
----------- -------------------
1           <d att="1" />
2           <d att="1" />
3           <d att="1" />
于 2012-10-10T19:25:52.710 に答える