XQuery – Lendo XML no SQL Server

XQuery

Uma das vantagens de se trabalhar com tipo XML no XML Server é a facilidade de recuperar partículas de dados no formato XML, por meio de consultas, denominadas XQuery.

Tendo uma variável XML, vamos caminhar para as primeiras consultas com XQuery:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
DECLARE @XML XML
SET @XML = '
<note>
    <id>1</id>
    <to mail="maria@email.com">maria</to>
    <from mail="ana@email.com">ana</from>
    <heading>Reminder</heading>
    <body>Happy Birthday</body>
    <date>2011-01-01</date>
</note>
<note>
    <id>2</id>
    <to mail="ana@email.com">ana</to>
    <from mail="maria@email.com">maria</from>
    <heading>RE: Reminder</heading>
    <body>Thanks</body>
    <date>2011-01-01</date>
</note>
<note>
    <id>3</id>
    <to mail="maria@email.com">maria</to>
    <from mail="ana@email.com">ana</from>
    <heading>RE: RE: Reminder</heading>
    <body>Party?</body>
    <date>2011-01-02</date>
</note>
'

 

Método “query()”

Para recuperar certas partículas de um XML, mantendo ainda este formato, se torna facilmente praticável com o método query. Para uma simples demonstração (não exibindo ainda todo potencial deste método), vamos recuperar informações de um determinado caminho (XPath):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
--1. Recuperando XML de um caminho simples
SELECT @XML.query('note/to')
 
--Resultado:
--<to mail="maria@email.com">maria</to><to mail="ana@email.com">ana</to><to mail="maria@email.com">maria</to>
 
--
 
--2. Recuperando XML de um caminho específico
-- , no caso, o primeiro caso da tag "note"
SELECT @XML.query('note[1]/to')
 
--Resultado:
--<to mail="maria@email.com">maria</to>
 
--
 
--3. Recuperando XML de um caminho específico
-- , onde from possui o texto "maria"
SELECT @XML.query('note[from=''maria'']/to')
 
--Resultado:
--<to mail="ana@email.com">ana</to>
 
--
 
--4. O mesmo caso anterior, especificando o termo "text()"
SELECT @XML.query('note[from/text()=''maria'']/to')
 
--Resultado:
--<to mail="ana@email.com">ana</to>
 
--
 
--5. O mesmo caso anterior, filtrando por um atributo
SELECT @XML.query('note[from/@mail=''maria@email.com'']/to')
 
--Resultado:
--<to mail="ana@email.com">ana</to>

 

Método “value()”

O método value permite recuperar valores de caminhos bem específicos de um XML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
--1. Recuperando o valor de um "id", do tipo INT
SELECT @XML.value('(note/id)[1]', 'int')
 
--Resultado:
--1
 
--
 
--2. Recuperando o valor de um atributo mail, do tipo "varchar"
SELECT @XML.value('(note/to)[1]/@mail', 'varchar(45)')
 
--Resultado:
--maria@email.com
 
--
 
--3. Recuperando o valor de um atributo mail, do tipo "varchar"
SELECT @XML.value('(note[from/@mail=''maria@email.com'']/to)[1]/@mail', 'varchar(45)')
 
--Resultado:
--ana@email.com
 
--
 
--4. Recuperando datas de uma caminho específico
SELECT @XML.value('(note/date)[1]', 'date')
UNION ALL
SELECT @XML.value('(note/date)[3]', 'date')
UNION ALL
SELECT @XML.value('(note/date)[5]', 'date')
 
--Resultado:
--2011-01-01
--2011-01-02
--NULL

 

Método “exist()”

O método exist verifica se o caminho informado existe:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--1. Verificando a existência de um caminho específico
SELECT @XML.exist('note/date')
 
--Resultado
--1 (Existe)
 
--
 
--2. Verificando a existência de um caminho específico
SELECT @XML.exist('(note/date)[3]')
 
--Resultado
--1 (Existe)
 
--
 
--3. Verificando a existência de um caminho específico
SELECT @XML.exist('(note/date)[5]')
 
--Resultado
--0 (Não existe)

 

Método “nodes()”

O método nodes permite executar consultas sobre um XML com apoio dos métodos anteriores:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
--1. Consulta simples
SELECT C.query('.')
FROM @XML.nodes('note/to') AS T(C)
 
--Resultado
--<to mail="maria@email.com">maria</to>
--<to mail="ana@email.com">ana</to>
--<to mail="maria@email.com">maria</to>
 
--
 
--2. Consulta com mais critérios
SELECT
 C.value('id[1]', 'int'),
 C.value('date[1]', 'date'),
 C.value('from[1]/@mail', 'varchar(25)'),
 C.query('to')
 
FROM @XML.nodes('note') AS T(C)
 
WHERE C.exist('to') = 1
 
--Resultado
--1 2011-01-01  ana@email.com   <to mail="maria@email.com">maria</to>
--2 2011-01-01  maria@email.com <to mail="ana@email.com">ana</to>
--3 2011-01-02  ana@email.com   <to mail="maria@email.com">maria</to>

1
--FIM
Please follow and like us:

Deixe um comentário

This site uses Akismet to reduce spam. Learn how your comment data is processed.