次の XML では、 IsEurozone という名前のすべてのノードの名前をHasFxrEuroに変更する必要があります。
<?xml version="1.0" encoding="utf-8"?>
<MacroScenarios>
<MacroScenario>
<Id>1</Id>
<Name>Macro Scenario 1</Name>
<Scenarios>
<Scenario>
<CountryIsoAlpha3>USA</CountryIsoAlpha3>
<Id>1</Id>
<IsEurozone>true</IsEurozone>
</Scenario>
<Scenario>
<CountryIsoAlpha3>GER</CountryIsoAlpha3>
<Id>2</Id>
<IsEurozone>true</IsEurozone>
</Scenario>
</Scenarios>
</MacroScenario>
</MacroScenarios>
置換操作は簡単に実行できます (Mikael Erikssons の投稿How to rename XML node name in a SQL Server に感謝します):
UPDATE [dbo].[MacroScenarioSets] set
[ContentAsXml] =
replace(
replace(
cast(ContentAsXml as nvarchar(max)),
'<IsEurozone>',
'<HasFxrEuro>'),
'</IsEurozone>',
'</HasFxrEuro>')
その後、シナリオ ノードの内容は次のようになります。
<Scenario>
<CountryIsoAlpha3>USA</CountryIsoAlpha3>
<Id>1</Id>
<HasFxrEuro>true</HasFxrEuro>
</Scenario>
しかし、私の場合、ノードの厳密なアルファベット順が必要なため、HasFxrEuroをIdの前に配置する必要があります。
私の考えは、次のようなことをすることでした
UPDATE [dbo].[MacroScenarioSets]
SET ContentAsXml.modify('insert
<HasFxrEuro>{(/MacroScenarios/MacroScenario/Scenarios/Scenario/IsEurozone/text())}</HasFxrEuro>
after (/MacroScenarios/MacroScenario/Scenarios/Scenario/CountryIsoAlpha3)')
その後、古いIsEurozoneノードをすべて削除します。ただし、XML DML には、挿入ステートメント用のシングルトンが必要です。XML DML でそれを達成する別の方法はありますか?