2013-09-03 2 views
1

XML ниже имеет необычный вид. Как извлечь все пары имен полей и значений полей из следующего XML, используя XQuery в SQL Server? Меня особенно интересует извлечение значений полей с именем поля 1006.Извлечение информации из XML с использованием TSQL

<details> 
    <fieldname>1006</fieldname> 
    <fieldvalue>HSBC BANK PLC</fieldvalue> 
</details> 
<details> 
    <fieldname>1005</fieldname> 
    <fieldvalue>POOLE LONGFLEET</fieldvalue> 
</details> 
<details> 
    <fieldname>1059</fieldname> 
    <fieldvalue>165-167 High Street</fieldvalue> 
</details> 
<details> 
    <fieldname>1063</fieldname> 
    <fieldvalue>POOLE</fieldvalue> 
</details> 

У меня есть относительно большое количество XMLs для обработки и до сих пор я использую комбинацию patIndex и substring, чтобы сделать это.

ответ

3

Попробуйте это одно

DECLARE @XML XML 
SELECT @XML = ' 
<details> 
    <fieldname>1006</fieldname> 
    <fieldvalue>HSBC BANK PLC</fieldvalue> 
</details> 
<details> 
    <fieldname>1006</fieldname> 
    <fieldvalue>test2</fieldvalue> 
</details> 
<details> 
    <fieldname>1005</fieldname> 
    <fieldvalue>POOLE LONGFLEET</fieldvalue> 
</details> 
<details> 
    <fieldname>1059</fieldname> 
    <fieldvalue>165-167 High Street</fieldvalue> 
</details> 
<details> 
    <fieldname>1063</fieldname> 
    <fieldvalue>POOLE</fieldvalue> 
</details>' 

SELECT 
     fieldname = t.c.value('./fieldname[1]', 'INT') 
    , fieldvalue = t.c.value('./fieldvalue[1]', 'VARCHAR(100)') 
FROM @XML.nodes('details') t(c) 
WHERE t.c.value('./fieldname[1]', 'INT') = 1006 

В выходе -

tt

Update:

В примере, XML не имеют ROOT узел, так что вы просто необходимо правильно указать путь:

SELECT t.c.query('.') 
FROM @XML.nodes('details') t(c) 

запросов разделить ваши узлы в строки:

tt

После него, для каждой строки, вы можете получить данные с помощью XML метода value:

t.c.value('<path>', '<datatype>') 

За дополнительной информацией прочитать topic.

+0

Отлично! Не могли бы вы дать мне краткое объяснение, как это работает? – wujtehacjusz

+0

Добро пожаловать @wujtehacjusz, а также, пожалуйста, ознакомьтесь с обновлением. – Devart

Смежные вопросы