2017-04-03 8 views
0

これまではこのクエリを作成しようとしていましたが、これまで役に立たなかったのです。SQL ServerのXML列に格納されたデータに基づいて文字列を構築する

次は、SQL ServerのXML列からのいくつかの部分のデータである。

<DashboardWidgets> 
    <DashboardWidget id="14"> 
     <EnumName>PersonalProgressIndividual</EnumName> 
     <OnOff>1</OnOff> 
     <Movable>0</Movable> 
     <Removable>0</Removable> 
     <SubItemData> 
      <SubItem id="1"> 
       <OnOff>1</OnOff> 
       <Movable>1</Movable> 
       <Removable>1</Removable> 
      </SubItem> 
      <SubItem id="2"> 
       <OnOff>1</OnOff> 
       <Movable>1</Movable> 
       <Removable>1</Removable> 
      </SubItem> 
      <SubItem id="3"> 
       <OnOff>1</OnOff> 
       <Movable>1</Movable> 
       <Removable>1</Removable> 
      </SubItem> 
      <SubItem id="4"> 
       <OnOff>0</OnOff> 
       <Movable>0</Movable> 
       <Removable>0</Removable> 
      </SubItem> 
      <SubItem id="6"> 
       <OnOff>0</OnOff> 
       <Movable>0</Movable> 
       <Removable>0</Removable> 
      </SubItem> 
     </SubItemData> 
    </DashboardWidget> 
</DashboardWidgets> 

私の目標は、テーブルを照会し、IDおよび値のフォーマットされた文字列を取得することです。

例として、IDが14のDashboardWidgetノードを照会し、その中に含まれるSubItemData子ノードから文字列を構築する必要があります。

14のIDとダッシュボードウィジェットのクエリに必要な文字列の結果は次のようになります。

"1,1,1,1|2,1,1,1|3,1,1,1|4,0,0,0|6,0,0,0" 

私はすべての値を抽出することではなく、すべての任意の区切り文字なしに近づくことができました。

DECLARE 
    @companyID INT = 23 
    ,@dwID  INT = 14 
; 

DECLARE @xml xml 
SELECT @xml = c.DashboardWidgetSettings FROM dbo.Company c WHERE c.CompanyID = @companyID; 

SELECT 
    x.Rec.query('./SubItem').value('.', 'varchar(max)') AS 'SubItemData' 
FROM @xml.nodes('/DashboardWidgets/DashboardWidget[@id=sql:variable("@dwID")]/SubItemData') as x(Rec) 
; 

どのようなヘルプや正しい方向のポイントがあれば幸いです。

答えて

1
Declare @XML xml = '<DashboardWidgets><DashboardWidget id="14"><EnumName>PersonalProgressIndividual</EnumName><OnOff>1</OnOff><Movable>0</Movable><Removable>0</Removable><SubItemData><SubItem id="1"><OnOff>1</OnOff><Movable>1</Movable><Removable>1</Removable></SubItem><SubItem id="2"><OnOff>1</OnOff><Movable>1</Movable><Removable>1</Removable></SubItem><SubItem id="3"><OnOff>1</OnOff><Movable>1</Movable><Removable>1</Removable></SubItem><SubItem id="4"><OnOff>0</OnOff><Movable>0</Movable><Removable>0</Removable></SubItem><SubItem id="6"><OnOff>0</OnOff><Movable>0</Movable><Removable>0</Removable></SubItem></SubItemData></DashboardWidget></DashboardWidgets>' 

Select Stuff((Select Distinct '|' +String 
       From (
        Select String = f.n.value('@id','varchar(50)') 
            +',' 
            +f.n.value('(OnOff)[1]','varchar(50)') 
            +',' 
            +f.n.value('(Movable)[1]','varchar(50)') 
            +',' 
            +f.n.value('(Removable)[1]','varchar(50)') 
        From @XML.nodes('DashboardWidgets/DashboardWidget/SubItemData') t(n) 
        Cross Apply t.n.nodes('SubItem ') f(n) 
        ) X 
       For XML Path ('')),1,1,'') 

戻り

1,1,1,1|2,1,1,1|3,1,1,1|4,0,0,0|6,0,0,0 
+0

うわー!私は十分にあなたに感謝することはできません、ジョン。それはまさに私が必要としていて、完璧に動作します!乾杯! – webface

+0

@webfaceお手伝いします:) –

関連する問題