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>

这两行我需要转换它们。

<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>

基本上每行都必须分成两部分并重新命名。我可以处理重命名我只是在拆分列时遇到了麻烦。我也必须在 ReferenceNames 部分做同样的事情。那个更容易,因为它总是“0”和“1”,所以我可以简单地将xml转换为字符串并找到替换它。不过,ReferenceFeatures 部分更复杂,因为名称部分中可以包含任何内容。

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 回答