0

を使用して SQL Server テーブルの XML 列を更新しようとしています。

XML.modify replace value of (XML DML)

vendorId以下の XML の例では、すべての値1を別の値に置き換える方法はありますか? http://technet.microsoft.com/en-us/library/ms190675.aspxのドキュメントから、レコード インデックスを指定する必要があるようです。しかし、私の場合、xml 内に複数のレコードがあり、その順序がわかりません。

<LineItems>
  <LineItem productId="48" invId="1573" quantity="1" id="1" vendorId="1022" price="1350.0000" cost="450.0000" discount="0" acqu="2" />
  <LineItem productId="1" invId="0" quantity="1" id="2" vendorId="1" price="400" cost="0" discount="0" />
  <LineItem productId="46" invId="1574" quantity="1" id="3" vendorId="1022" price="789.0000" cost="263.0000" discount="0" acqu="4" />
  <LineItem productId="1" invId="0" quantity="1" id="4" vendorId="1" price="300" cost="0" discount="0" />
</LineItems>

ご意見をお聞かせください。

ありがとう!

4

2 に答える 2

1

ループを使用して、一度に 1 つの値を更新する必要があります。

while @XML.exist('/LineItems/LineItem[@vendorId = "1"]') = 1
  set @XML.modify('replace value of (/LineItems/LineItem[@vendorId = "1"]/@vendorId)[1] with "2"' )

SQL フィドル

テーブル内の XML 列を更新するバージョンは次のようになります。

while exists(
            select * from T
            where T.XMLColumn.exist('/LineItems/LineItem[@vendorId = "1"]') = 1
                  --and [some other condition]
            )
begin
  update T
  set XMLColumn.modify('replace value of (/LineItems/LineItem[@vendorId = "1"]/@vendorId)[1] with "2"')
  where T.XMLColumn.exist('/LineItems/LineItem[@vendorId = "1"]') = 1
        --and [some other condition]
end

SQL フィドル

于 2014-01-29T06:44:15.623 に答える
0

定数文字列を別の文字列に置き換える必要がある場合は、REPLACE関数を使用して文字列に対して実行することをお勧めします。

DECLARE @XML XML /*your xml value*/
SELECT REPLACE(CONVERT(NVARCHAR(MAX),@XML),'vendor="1"','"vendor="2"')

多くの場合、xml スタイルで行う方がはるかに簡単です。

于 2014-01-29T01:35:20.293 に答える