2015-03-03 61 views
1

我已经设置了一个从XML格式的记录XML类型的阅读,我通过从他们SQL:循环和

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

我需要用我更换#1环

更新: 我更新了XML数据。

预计从这个数据是FDSerial的节点值。 我希望我解释清楚我的问题

+0

什么是您所提供的使用示例XML你预期的输出? – 2015-03-03 13:31:04

+0

您是否可以编辑您的问题以包含具有预期输出的更大的XML文件? – 2015-03-03 15:13:56

回答

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) 
+0

谢谢你的帮助,其实我之前做过,但由于测试xml的序列全都像00000008,所以我认为它没有工作:(. – Tamer 2015-03-04 14:23:14

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] 
+0

虽然这段代码片段可能会解决这个问题,[包括解释] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高你的文章的质量。请记住,你正在回答未来读者的问题,而那些人们可能不知道你的代码建议的原因。 – gunr2171 2015-03-04 16:12:34