【问题标题】:SQL:Looping and Reading from XML typeSQL:从 XML 类型循环和读取
【发布时间】:2015-03-03 12:27:45
【问题描述】:

我有一组 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 的 Nodes 值。 我希望我清楚地解释了我的问题

【问题讨论】:

  • 使用您提供的示例 XML,您的预期输出是什么?
  • 您能否编辑您的问题以包含具有预期输出的更大 XML 文件?

标签: sql sql-server xml xml-namespaces


【解决方案1】:

您根本不需要循环。使用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)

【讨论】:

  • 谢谢你的帮助,其实我之前做过,但是因为测试 xml 序列都是 00000008 所以我认为它不起作用:(。
【解决方案2】:

这个也可以

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

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
猜你喜欢
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 2012-02-14
相关资源
最近更新 更多