3

私は 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」を超えるデータは無視されます (このデータの使用には許容されます)。

4

2 に答える 2

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:<Table1> 1 番目と 2 番目のXML ノードの値を<Table1>隣り合わせて取得するには、1 番目のノードを取得し、2 番目のノードを取得する 2 つの呼び出しを行う必要があります.nodes()。特にそれをさらに拡張したい場合は、少し毛むくじゃらになります-そしてパフォーマンスはひどいものになるでしょう-しかし、それは機能します:-)

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
于 2011-05-24T19:04:32.717 に答える
2

それは奇妙なレイアウトです。行ではなく、Sharedparam、Antoher などの列が必要です。

そして、私がその権利を読むとmaxOccurs="unbounded"、列の可変数を意味するTable1 =列の型と数が固定されているSQLではありません

各タグを列 (固定で有限) として読み取るには、次のようにします。

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)
于 2011-05-24T19:10:16.973 に答える