2012-01-04 2 views
2

я узнал, что ниже SQL можно использовать для извлечения данных из XMLИзвлечение данных из 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. благодаря

+0

почему бы не поговорить с человеком, который дал вам этот код и они вам это объяснить? –

+0

Да, я спросил, но не получил ответа .... если вы знаете, то PLZZ помочь мне. – Thomas

ответ

1

Функция 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 
+0

может у вас, пожалуйста, покажите мне еще некоторое использование аналогичного извлечения данных из xml. u said - 1 означает, что вы хотите получить значение из первого появления SearchField в XML. [2] тогда, конечно, даст вам второе появление. Без [1] вы запрашиваете все вхождения SearchField. введите код примера, где вы используете [1] и [2] и без [1]. поэтому я могу выпустить код ur на сервере sql, а затем попытаться понять, как все работает. спасибо – Thomas

+0

@Thomas Вы можете взглянуть на вопросы и ответы с меткой xquery-sql. http://stackoverflow.com/questions/tagged/xquery-sql –

+0

спасибо, что я заберу ссылку, но было бы лучше, если бы предоставили 2 или 3 маленьких образца для [1] или [2]. если возможно, пожалуйста, дайте мне пример запроса – Thomas

1

В принципе, FROM пункт здесь:

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

создает «псевдо таблицы» фрагментов XML - это перебирает все XML-узлы <NewDataSet>/<param> и создает, что псевдо таблица (так называемый A) с колонкой псевдо B из type 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 заявления.