Utilisez XQuery pour get ces données

Je suis nouveau à XQuery et ai quelques problèmes avec lui. Voici mon exemple.

J'ai cette variable:

declare @xmlDoc XML 

il contient le xml suivant:

 <?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:ssortingng" minOccurs="0" /> <xs:element name="Antoher" type="xs:ssortingng" minOccurs="0" /> <xs:element name="RandomParam2" type="xs:ssortingng" minOccurs="0" /> <xs:element name="MoreParam" type="xs:ssortingng" minOccurs="0" /> <xs:element name="ResultsParam" type="xs:ssortingng" 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> 

Comment puis-je sélectionner toutes les valeurs de Sharedparam? (Ou vraiment toute requête décente qui renvoie des valeurs (pas xml) serait géniale.)

Ce que je cherche vraiment à faire, c'est get un set de résultats comme celui-ci:

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

Cela me ferait ignorer toutes datatables au-delà de "Value4" (et cela est acceptable pour mon utilisation de ces données).

Essayez quelque chose comme ceci:

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

Donne moi une sortie de:

 (No column name) shared Hey 

Mise à jour: si vous souhaitez get tous les éléments XML et leurs valeurs dans les éléments <Table1> , vous pouvez utiliser cette requête XQuery:

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

qui produit:

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

Mise à jour # 2: pour get les valeurs du premier nœud <Table1> et du second nœud <Table1> XML l'un à côté de l'autre, vous devez faire deux appels à .nodes() – une fois le premier nœud récupéré, l'autre fois le second un. Ça devient un peu poilu, surtout si vous voulez aller encore plus loin – et la performance va être épouvantable – mais ça marche 🙂

 SELECT TBL.SParam.value('local-name(.)[1]', 'varchar(50)') 'Atsortingbute', 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)') 

Donne une sortie de:

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

C'est une layout étrange. Vous attendez des colonnes Sharedparam, Antoher etc: pas de lignes.

Et si je lis bien, Table1 maxOccurs="unbounded" ce qui signifie un nombre variable de colonnes = pas SQL qui est le type de colonne fixe et le nombre

Pour lire chaque tag comme une colonne (qui sont fixes et finis), vous feriez ceci:

 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)