1

XML 列のノード属性を更新しようとしていますが、行き詰まっています。確かに、XQueryは 1 日前まで私にとってホワイト ノイズでした。私はもう少し頑張ることができましたが、それは私の顧客を傷つけるでしょう。私はSOを上下にトロールしましたが、それでも立ち往生しています。

だからここに私のセットアップの関連部分があります:

テーブル:

CREATE TABLE Tbl(Id int IDENTITY, XmlCol XML)
INSERT Tbl VALUES(
'<root>
  <item ID="1">some text input</item>
  <item ID="7" PROP="10">1</item>
</root>
'
)
INSERT Tbl VALUES(
'<root>
  <item ID="1">some other text input</item>
  <item ID="8" PROP="10">1</item>
</root>
'
)

環境?理由は聞かないでください。あまりにもわざとらしく、意味を理解しようとすると行き詰まってしまうでしょう。

ID 属性が「8」のすべてのアイテム ノードについて、PROP 属性を 30 増やす必要があります。それが完了したら、一致するノードの ID 属性を「8」から「7」に更新し、アイテムを効果的にマージする必要があります。 、PROP 値を別々に保ちます。

これは私が得た限りではありますが、SQL Server (または私) はうまく機能していません。

更新ステートメント:

DECLARE @newVal INT = 40

update Tbl
set XmlCol.modify('replace value of (/root/item[@ID="8"][@PROP="10"]/@PROP)[1]
                   with sql:variable("@newVal") ')

結果:

XQuery [Tbl.XMLCol.modify()]: ")" が予期されていました。

誰?

4

2 に答える 2

0

@nkstr のような同様の問題が発生していました。@Roman Pekar からの回答は、属性値を更新し、他の属性をフィルタリングする方法について良いアイデアを得るのに役立ちました。これが私が使用したSQLです。

declare @X xml = 
'<root>
<items>
    <item ItemID="100">
        <obj ObjID="0001" value="val1"/>
        <obj ObjID="0002" value="val2"/>
        <obj ObjID="0003" value="val3"/>
        <obj ObjID="0004" value="val4"/>
    </item>
    <item ItemID="200">
        <obj ObjID="0001" value="val1"/>
        <obj ObjID="0002" value="val2"/>
        <obj ObjID="0003" value="val3"/>
        <obj ObjID="0004" value="val4"/>
    </item>
</items>
</root>'

declare @ITEMID int = 200 
declare @OBJID int = 0004
declare @NEWVAL int = 8888

--update ObjID 0004 at ItemID 200 into 8888 (this is a comment)

set @X.modify('replace value of  (/root/items/item[@ItemID=sql:variable("@ITEMID")]/obj[@ObjID=sql:variable("@OBJID")]/@ObjID)[1] with sql:variable("@NEWVAL")')

select @X
于 2013-11-06T22:18:58.273 に答える