代码之家  ›  专栏  ›  技术社区  ›  Kapil

按顺序显示SQL XML数据

  •  0
  • Kapil  · 技术社区  · 6 年前

    表中有以下XML节点。但当我提取数据时,我无法正确地读取它

    SELECT Data.value('(/*//Plans/Plan/Coverages/Coverage/Answers/Entry[@key="NumberOfHoldDays"]/value)[1]', 'nvarchar(max)') as PLANA
    ,Data.value('(/*//Plans/Plan/Coverages/Coverage/Answers/Entry[@key="NumberOfHoldDays"]/value)[2]', 'nvarchar(max)') AS PLANB
    ,Data.value('(/*//Plans/Plan/Coverages/Coverage/Answers/Entry[@key="NumberOfHoldDays"]/value)[3]', 'nvarchar(max)') AS PLANC 
    FROM Maintenance
    

    如果我像上面那样读取XML数据,

    SNO    PLan A PLan B Plan C
    1      11      22      33
    2      NULL    44      55
    
    Output for above example :
    
    SNO    PLan A PLan B Plan C
    1      11      22      33
    2      NULL    44      55
    
    But now for the above query it shows as below :
    
    SNO    PLan A PLan B Plan C
    1      11      22      33
    2      44      55     NULL
    

    XML示例如下:

    <Plans>
      <Plan>
       <Coverages>
        <Coverage>
          <Answers>
               <Entry key="NumberOfHoldDays" type="System.String">
                    <value>5</value>
                  </Entry>
      </Answers>
      </Coverage>
    </Coverages>
    <ID>1</ID>
     </Plan>
    <Plans>
      <Plan>
       <Coverages>
        <Coverage>
          <Answers>
               <Entry key="NumberOfHoldDays" type="System.String">
                    <value>55</value>
                  </Entry>
      </Answers>
      </Coverage>
    </Coverages>
    <ID>2</ID>
     </Plan>
    
    <Plans>
      <Plan>
       <Coverages>
        <Coverage>
          <Answers>
               <Entry key="NumberOfHoldDays" type="System.String">
                    <value>50</value>
                  </Entry>
      </Answers>
      </Coverage>
    </Coverages>
    <ID>3</ID>
     </Plan>
    </Plans>
    

    如何根据id标签读取XML以获得我正在使用的、但不起作用的适当值

    1 回复  |  直到 6 年前
        1
  •  0
  •   Kapil    6 年前

    以下代码有效:

    SELECT Data.value('(/*//Plans/Plan[ID="1"]/Coverages/Coverage/Answers/Entry[@key="NumberOfHoldDays"]/value)[1]', 'nvarchar(max)') as PLANA
    ,Data.value('(/*//Plans/Plan[ID="2"]/Coverages/Coverage/Answers/Entry[@key="NumberOfHoldDays"]/value)[1]', 'nvarchar(max)') AS PLANB
    ,Data.value('(/*//Plans/Plan[ID="3"]/Coverages/Coverage/Answers/Entry[@key="NumberOfHoldDays"]/value)[1]', 'nvarchar(max)') AS PLANC 
    FROM Maintenance