SQL:从XML类型循环和读取

时间:2015-03-03 12:27:46

标签: sql sql-server xml xml-namespaces

我有XML类型的记录集,我需要遍历节点并从中提取数据

<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <OP xmlns="http://tempuri.org/Types.xsd">
        <ID>
          <FDSerial>00000008</FDSerial>
          <Type>1</Type>
        </ID>
        <Param>1</Param>
        <OperationName>ReadData</OperationName>
      </OP>
      <OP xmlns="http://tempuri.org/Types.xsd">
        <ID>
          <FDSerial>00000009</FDSerial>
          <Type>1</Type>
        </ID>
        <Param>1</Param>
        <OperationName>ReadData</OperationName>
      </OP>
    </Data>

我已经从记录中读过但我需要遍历节点

    ;WITH XMLNAMESPACES('http://tempuri.org/Types.xsd' as ns) 
SELECT  Data.value('/Data[1]/ns:Op[1]/ns:ID[1]/ns:FDSerial[1]', 'varchar(50)')
        as Serial   
  FROM [dbo].[DB]

我需要在循环中用i替换#1

更新: 我更新了xml数据。

此数据的预期值是FDSerial的节点值。 我希望我能清楚地解释我的问题

2 个答案:

答案 0 :(得分:0)

你根本不需要循环。在十字架中使用nodes()应用于/Data/OP上的碎片。

with xmlnamespaces('http://tempuri.org/Types.xsd' as ns)
select T.X.value('(ns:ID/ns:FDSerial/text())[1]', 'varchar(50)') as Serial
from dbo.DB
  cross apply DB.Data.nodes('/Data/ns:OP') as T(X)

答案 1 :(得分:0)

这也可以

;WITH XMLNAMESPACES('http://tempuri.org/Types.xsd' as ns) 
SELECT  Data.value('(Data/ns:Op/ns:ID/ns:FDSerial/text())[1]', 'varchar(50)')
        as Serial   
  FROM [dbo].[DB]