1

XML 文字列があり、SQL 内で操作する必要があります。

<RuleData ReturnVariable="">
  <MateProperties>
    <Property Key="value" DisplayName="name value" />
    <Property Key="value2" DisplayName="name value2" />
  </MateProperties>
  <ReferenceNames>
    <Item Name="0" Value="=CouplerType + &quot;-1&quot;" />
    <Item Name="1" Value="Driveshaft-1" />
  </ReferenceNames>
  <ReferenceFeatures>
    *<Item Name="=CouplerType + &quot;-1&quot;" Value="CSYS_BOREB" />
    <Item Name="Driveshaft-1" Value="CSYS_CouplerINSIDE" />*
  </ReferenceFeatures>
</RuleData>

これらの 2 行を変換する必要があります。

<Item Name="=CouplerType + &quot;-1&quot;" Value="CSYS_BOREB" />
<Item Name="Driveshaft-1" Value="CSYS_CouplerINSIDE" />

この新しいフォーマットに。

<Value>
  <Column Value="=CouplerType + &quot;" />
  <Column Value="CSYS_BOREB" />
</Value>
<Value>
  <Column Value="Driveshaft-1" />
  <Column Value="CSYS_CouplerINSIDE" />
</Value>

基本的に、各行を 2 つに分割して名前を変更する必要があります。名前の変更を処理できますが、列を分割するのに問題があります。ReferenceNames セクションでもまったく同じことを行う必要があります。それは常に「0」と「1」であるため簡単なので、xmlを文字列に変換して、それに置き換えることができます。ただし、ReferenceFeatures セクションはより複雑です。なぜなら、name セクションには何でも入れることができるからです。

4

1 に答える 1

0
declare @xml xml =
    N'<RuleData>
        <ReferenceFeatures>
            <Item Name="=CouplerType + &quot;-1&quot;" Value="CSYS_BOREB" />
            <Item Name="Driveshaft-1" Value="CSYS_CouplerINSIDE" />
        </ReferenceFeatures>
    </RuleData>'

;with items as
(
    select
        row_number() over (order by (select 1)) as RowNumber
        ,t.n.value('@Name', 'nvarchar(255)') as Name
        ,t.n.value('@Value', 'nvarchar(255)') as Value
    from @xml.nodes('//RuleData/ReferenceFeatures/Item') as t(n)
)
select
    (select it.Name as [@Value] for xml path ('Column'), type),
    (select it.Value as [@Value] for xml path ('Column'), type)
from items it
order by it.RowNumber
for xml raw ('Value'), type
于 2012-11-19T08:04:21.200 に答える