2015-03-03 88 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