Извлечь данные из xml

Я узнал, что приведенный ниже sql можно использовать для извлечения данных из xml

--XML DATA SAMPLE        
DECLARE @xmlvar xml      
SET @xmlvar='      
<NewDataSet>      
  <param>      
    <SearchField>JID</SearchField>      
    <FilterCondition>%</FilterCondition>      
    <ConditionData>4000</ConditionData>      
    <MatchCase>0</MatchCase>      
    <Table>MyTableName</Table>      
  </param>      
  <param>      
    <SearchField>Specialist</SearchField>      
    <FilterCondition>=</FilterCondition>      
    <ConditionData>Nigel Graham</ConditionData>      
    <MatchCase>0</MatchCase>      
    <Table>MyTableName</Table>      
  </param>      
</NewDataSet>'  

SELECT  A.B.value('(SearchField)[1]', 'VARCHAR(255)' ) SearchField,
A.B.value('(FilterCondition)[1]', 'VARCHAR(25)' ) Operator,
A.B.value('(ConditionData)[1]', 'VARCHAR(MAX)' ) ConditionData,
A.B.value('(MatchCase)[1]', 'BIT' ) MatchCase,
A.B.value('(Table)[1]', 'VARCHAR(MAX)' ) TableName
FROM    @WhereClause_XML.nodes('/NewDataSet/param') A(B)

приведенный выше xml работает, но я не знаком с указанным выше типом sql. поэтому, пожалуйста, скажите мне, что означает (FilterCondition) [1] или (ConditionData) [1], почему скобка [1], почему не скобка [0] или [2].

пожалуйста, объясните мне, как работает указанный выше xml. Благодарность


person Thomas    schedule 04.01.2012    source источник
comment
почему бы не поговорить с человеком, который дал вам этот код, и попросить его объяснить вам?   -  person Stealth Rabbi    schedule 04.01.2012
comment
да, я спросил, но не получил ответа .... если вы знаете, пожалуйста, помогите мне.   -  person Thomas    schedule 04.01.2012


Ответы (2)


Функция value () возвращает одно значение из вашего XML, поэтому используется XPath должен указывать на один конкретный узел. [1] в (SearchField)[1] означает, что вам нужно значение из первого появления SearchField в XML. [2] тогда, конечно, даст вам второй случай. Без [1] вы запрашиваете все вхождения SearchField.

Обновление: Пример кода:

declare @x xml = 
'<root>
  <item>1</item>
  <item>2</item>
</root>'

select @x.value('(root/item)[1]', 'int') as One,
       @x.value('(root/item)[2]', 'int') as Two

Результат:

One         Two
----------- -----------
1           2
person Mikael Eriksson    schedule 04.01.2012
comment
не могли бы вы показать мне еще несколько примеров использования аналогичного извлечения данных из xml. u сказал - 1 означает, что вам нужно значение из первого вхождения SearchField в XML. [2], конечно, даст вам второе вхождение. Без [1] вы запрашиваете все вхождения SearchField. поставляется с некоторым примером кода, в котором вы используете [1] и [2] и без [1]. поэтому я могу выдать код ur на сервере sql, а затем попытаться понять, как все работает. Благодарность - person Thomas; 04.01.2012
comment
@Thomas Вы можете посмотреть вопросы и ответы с тегами xquery-sql. stackoverflow.com/questions/tagged/xquery-sql - person Mikael Eriksson; 04.01.2012
comment
Спасибо, конечно, я перейду по ссылке, но было бы лучше, если бы предоставили 2 или 3 небольших образца для [1] или [2]. если возможно, дайте мне образец запроса - person Thomas; 04.01.2012
comment
@Thomas добавил образец к ответу. - person Mikael Eriksson; 04.01.2012

По сути, предложение FROM здесь:

FROM @WhereClause_XML.nodes('/NewDataSet/param') A(B)

создает «псевдотаблицу» из фрагментов XML - она ​​перечисляет все узлы XML <NewDataSet>/<param> и создает эту псевдотаблицу (называемую A) с псевдостолбцом B типа XML.

Эти столбцы будут содержать значения <param> - и SELECT достигает этих узлов XML.

SELECT A.B.value('(SearchField)[1]', 'VARCHAR(255)' ) SearchField

здесь из узла <param> извлекается первое <SearchField> значение элемента XML и возвращается как столбец с именем SearchField типа VARCHAR(255).

Судя по вашему коду, каждый узел <param>, вероятно, выглядит примерно так:

<param>
    <SearchField>......</SearchField>
    <FilterCondition>....</FilterCondition>
    <ConditionData>....</ConditionData>
    <MatchCase>....</MatchCase>
    <Table>....</Table>
</param>

и все эти значения извлекаются в столбцы вашего SELECT оператора.

person marc_s    schedule 04.01.2012