2012-06-13 60 views
4

我使用SQL Server 2008 R2和我的存儲過程發生在其中有多個級別這樣的結構化的XML:如何讀取XML的一部分,在SQL Server中的XML 2008 R2

DECLARE @XML xml = 
'<Main> 
    <User id="1"> 
     <Departments isSingle="0"> 
      <Department id="1">Admin</Department> 
      <Department id="2">HR</Department> 
      <Department id="3">Development</Department> 
     </Departments> 
    </User> 
    <User id="2"> 
     <Departments isSingle="1"> 
      <Department id="1">Admin</Department>    
     </Departments> 
    </User> 
</Main>' 

從上面的示例中,我想爲具有多個部門的用戶獲取2列(isSingle =「0」),其中第一列是用戶標識,第二列是整個XML。

我可以得到用戶ID與下面的查詢,但如何讓部門部分作爲XML:

SELECT 
     T.C.value('(../@id)','int') AS UserID 
    , T.C.value('(../Departments)[1]','nvarchar(max)') AS DepartmentsXML 
FROM 
@XML.nodes('/Main/User/Departments[@isSingle="0"]') AS T(C) 

它不允許我在的地方使用xml作爲數據類型的nvarchar(max)

如果細節不清楚,請告訴我,我會盡力完善。任何幫助表示讚賞。

+0

您希望從XML中直接獲取整個「Departments」節點,而不是每個節點的Department ID和名稱值? –

+0

@DarthContinent是的,我想部門的XML節點本身 – Wiz

回答

5

你接近 - 只需使用.query('.')你的第二個柱:

SELECT 
     T.C.value('(../@id)','int') AS UserID, 
     T.C.query('.') AS DepartmentsXML 
FROM 
@XML.nodes('/Main/User/Departments[@isSingle="0"]') AS T(C) 

這將返回的XML片段由.nodes()呼叫作爲選擇,作爲XML。

+1

優秀..謝謝。 – Wiz

相關問題