Извлечь данные из XML - PullRequest
       23

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

2 голосов
/ 04 января 2012

я узнал, что приведенный ниже 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. спасибо

Ответы [ 2 ]

1 голос
/ 04 января 2012

Функция 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
1 голос
/ 04 января 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>, извлекается первое значение XML-элемента <SearchField> и возвращается в виде столбца с именем SearchField типа VARCHAR(255).

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

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

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

...