これにより、各行の 1 つの URL が置き換えられます。サンプル XML を見ると、行ごとに 1 つの URL しかありません。
with C1 as
(
select xmlData,
xmlData.value('(/MA/A/URL/text())[1]', 'nvarchar(500)') as URL
from Pages
),
C2 as
(
select xmlData,
URL,
left(URL, len(URL) - 1) as URL2
from C1
where right(URL, 1) = '-'
)
update C2
set xmlData.modify('replace value of (/MA/A/URL/text())[1]
with sql:column("C2.URL2")')
CTE C1 の URL 値を抽出します。
URL から最後の「-」を削除し、CTE C2 の URL2 に入れます。更新する必要のない行も削除します。modify() メソッド (xml データ型)
を使用して XML を更新します。
代わりに、クエリの XML 部分でジョブを実行する別のバージョンを次に示します。
update Pages
set xmlData.modify('replace value of (/MA/A/URL/text())[1]
with fn:substring((/MA/A/URL/text())[1], 1, fn:string-length((/MA/A/URL/text())[1])-1)')
where xmlData.exist('/MA/A/URL[fn:substring(text()[1], fn:string-length(text()[1]), 1) = "-"]') = 1
一度に 1 つのノードしか更新できないため、1 つの行に複数の URL がある場合は、上記のコードをループに入れて、更新するものがある限り更新を行う必要があります。を使用@@ROWCOUNT
して、更新によって何かが更新されたかどうかを確認し、まで更新をやり直すことができます@@ROWCOUNT = 0
。