2011-05-24 138 views
3

我是XQuery的新手,並且遇到一些問題。這是我的例子。使用XQuery獲取此數據

我有這個變量:

declare @xmlDoc XML 

它存儲在它的下面的XML:

<?xml version="1.0" encoding="utf-8"?> 
<NewDataSet> 
    <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:Locale=""> 
     <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
      <xs:element name="Table1"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="Sharedparam" type="xs:string" minOccurs="0" /> 
       <xs:element name="Antoher" type="xs:string" minOccurs="0" /> 
       <xs:element name="RandomParam2" type="xs:string" minOccurs="0" /> 
       <xs:element name="MoreParam" type="xs:string" minOccurs="0" /> 
       <xs:element name="ResultsParam" type="xs:string" minOccurs="0" /> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:choice> 
     </xs:complexType> 
    </xs:element> 
    </xs:schema> 
    <Table1> 
    <Sharedparam>shared</Sharedparam> 
    <Antoher>sahre</Antoher> 
    <RandomParam2>Good stuff</RandomParam2> 
    <MoreParam>and more</MoreParam> 
    <ResultsParam>2</ResultsParam> 
    </Table1> 
    <Table1> 
    <Sharedparam>Hey</Sharedparam> 
    <Antoher>what </Antoher> 
    <RandomParam2>do you</RandomParam2> 
    <MoreParam>think</MoreParam> 
    <ResultsParam>2</ResultsParam> 
    </Table1> 
    <Table1 /> 
</NewDataSet> 

如何選擇Sharedparam的所有值? (還是真的返回值(不是XML任何像樣的查詢)將是巨大的。)

什麼我真的希望做的是得到一個結果集是這樣的:

Name    Value1   Value2   Value3  Value4 
Sharedparam  shared   Hey    Null   Null 
Another   share   what   Null   Null 
.... 

這會對我忽略任何超出「Value4」的數據(這對我使用這些數據是可以接受的)。

+0

這是一個奇怪的佈局。您期望列Sharedparam,Antoher等:不行。如果我讀得對,Table1'maxOccurs =「unbounded」'這意味着可變數量的列=不是SQL – gbn 2011-05-24 19:09:37

+0

我會忽略Value4以外的任何內容 – Vaccano 2011-05-24 19:15:35

回答

3

嘗試這樣:

SELECT 
    TBL.SParam.value('(.)[1]', 'varchar(50)') 
FROM 
    @xmldoc.nodes('/NewDataSet/Table1/Sharedparam') AS TBL(SParam) 

給我的輸出:

(No column name) 
shared 
Hey 

更新:,如果你想在所有的XML元素和<Table1>元素中的值,你可以使用這個XQuery:

SELECT 
    TBL.SParam.value('local-name(.)[1]', 'varchar(50)') 'Attribute', 
    TBL.SParam.value('(.)[1]', 'varchar(50)') 'Value' 
FROM 
    @xmldoc.nodes('/NewDataSet/Table1/*') AS TBL(SParam) 

,輸出:

Attribute   Value 
Sharedparam   shared 
Antoher    sahre 
RandomParam2   Good stuff 
MoreParam   and more 
ResultsParam   2 
Sharedparam   Hey 
Antoher    what 
RandomParam2   do you 
MoreParam   think 
ResultsParam   2 

更新#2:到彼此相鄰,你需要做兩次調用.nodes()拿到第<Table1>的值,第二<Table1> XML節點 - 一次檢索的第一個節點另一次是第二次。它變得有點毛茸茸的,特別是如果你想擴展,即使進一步 - 和性能將是糟糕 - 但它工作:-)

SELECT 
    TBL.SParam.value('local-name(.)[1]', 'varchar(50)') 'Attribute', 
    TBL.SParam.value('(.)[1]', 'varchar(50)') 'Value 1', 
    TBL2.SParam2.value('(.)[1]', 'varchar(50)') 'Value 2' 
FROM 
    @xmldoc.nodes('/NewDataSet/Table1[1]/*') AS TBL(SParam) 
INNER JOIN 
    @xmldoc.nodes('/NewDataSet/Table1[2]/*') AS TBL2(SParam2) ON TBL.SParam.value('local-name(.)[1]', 'varchar(50)') = TBL2.SParam2.value('local-name(.)[1]', 'varchar(50)') 

給出的輸出:

Attribute  Value 1  Value 2 
Sharedparam shared  Hey 
ResultsParam  2   2 
RandomParam2 Good stuff do you 
Antoher  sahre  what 
MoreParam  and more  think 
+0

感謝您的幫助!我想我可以通過我自己的方式來採取它的剩餘部分,但我被卡住了......有沒有辦法讓名字旁邊同一行的表[1]和表[2]的值都得到? (就像我的問題中的輸出示例)我可以爲單個「屬性」執行此操作。但我似乎無法讓它重複其餘的屬性。 – Vaccano 2011-05-24 20:17:49

+0

謝謝你的幫助! – Vaccano 2011-05-24 21:20:07

2

這一個奇怪的佈局。您期望列Sharedparam,Antoher等:不行。

如果我看錯,表1 maxOccurs="unbounded"這意味着一個可變的列數=不SQL是固定的列類型和數量

要讀取每個標籤作爲列(其是固定的,有限的)你」 d這樣做:

SELECT 
    x.item.value('(Sharedparam)[1]', 'varchar(100)') AS Sharedparam, 
    x.item.value('(Antoher)[1]', 'varchar(100)') AS Antoher, 
    x.item.value('(SharedRandomParam2param)[1]', 'varchar(100)') AS RandomParam2, 
    ... 
FROM 
    @xmlDoc.nodes('/NewDataSet/Table1') x(item)