Используйте XQuery, чтобы получить эти данные - PullRequest
3 голосов
/ 24 мая 2011

Я новичок в 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), был бы великолепен.)

Что я действительно хочу сделать, так это получить такой набор результатов:заставить меня игнорировать любые данные, кроме «Value4» (и это приемлемо для моего использования этих данных).

Ответы [ 2 ]

3 голосов
/ 24 мая 2011

Попробуйте что-то вроде этого:

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> и второго <Table1> XML-узла рядом друг с другом необходимо выполнить два вызова .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
2 голосов
/ 24 мая 2011

Это странная раскладка.Вы ожидаете, что столбцы Sharedparam, Antoher и т. Д. Не строки.

И если я правильно прочитал, Table1 maxOccurs="unbounded", что означает переменное число столбцов = не 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)
...