
XQuery – Lendo XML no SQL Server
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: