0

次の 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 でそれを達成する別の方法はありますか?

4

1 に答える 1