2012-11-19 83 views
1

我有一個xml字符串,需要在sql中操作它。TSQL拆分XML屬性

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

To This new format。

<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部分雖然更復雜,因爲任何可以在名稱部分。

回答

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