Usuário com melhor resposta
Outro select em XML

Pergunta
-
Gente,
Estou com o seguinte XML:
<ExportacaoDeProdutos>
<Item Produto="Produto 01">
<Preco>50,00</Preco>
<Desconto>5%</Desconto>
</Item>
<Item Produto="Produto 02">
<Preco>60,00</Preco>
<Desconto>10%</Desconto>
</Item>
<Item Produto="Produto 03">
<Preco>30,00</Preco>
<Desconto>20%</Desconto>
</Item>
</ExportacaoDeProdutos>
Quero listar o produto, seu preço e seu reespectivo desconto (Tudo em varchar), então, tentei a seguinte query:
SELECT
E.I.value('(../@Produto)[1]','NVARCHAR(20)') As Produto,
E.I.value('(..)','VARCHAR(100)') As Preco
mas ela me traz o campo preço junto com o desconto, assim:
50,005%
60,0010%
30,0020%
Tentei alguma forma de adicionar esse campo mas não consegui, alguem saberia como?
Fabrizzio A. Caputo
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCTS SQL Server 2008
Developer Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com
Respostas
-
Oi Fabrizzio,
O design desse XML já é um pouco mais desafiador que os anteriores. Como há elementos diferentes no nível mais baixo, mas tem apenas uma ocorrência de cada, teremos que ir a um dos níveis mais baixo, subir um nível e ir para o outro. Segue uma implementação:
declare @xml xml
set @xml = '<ExportacaoDeProdutos>
<Item Produto="Produto 01">
<Preco>50,00</Preco>
<Desconto>5%</Desconto>
</Item>
<Item Produto="Produto 02">
<Preco>60,00</Preco>
<Desconto>10%</Desconto>
</Item>
<Item Produto="Produto 03">
<Preco>30,00</Preco>
<Desconto>20%</Desconto>
</Item>
</ExportacaoDeProdutos>'SELECT
E.I.value('(../@Produto)[1]','NVARCHAR(20)') As Produto,
E.I.value('.','VARCHAR(100)') As Preco,
E.I.value('(../Desconto)[1]','VARCHAR(100)') As Desconto
FROM @xml.nodes('./ExportacaoDeProdutos/Item/Preco') E(I)[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Gustavo Maia Aguiar quinta-feira, 21 de julho de 2011 20:50
- Marcado como Resposta Fabrizzio CaputoModerator quinta-feira, 21 de julho de 2011 21:00
Todas as Respostas
-
Oi Fabrizzio,
O design desse XML já é um pouco mais desafiador que os anteriores. Como há elementos diferentes no nível mais baixo, mas tem apenas uma ocorrência de cada, teremos que ir a um dos níveis mais baixo, subir um nível e ir para o outro. Segue uma implementação:
declare @xml xml
set @xml = '<ExportacaoDeProdutos>
<Item Produto="Produto 01">
<Preco>50,00</Preco>
<Desconto>5%</Desconto>
</Item>
<Item Produto="Produto 02">
<Preco>60,00</Preco>
<Desconto>10%</Desconto>
</Item>
<Item Produto="Produto 03">
<Preco>30,00</Preco>
<Desconto>20%</Desconto>
</Item>
</ExportacaoDeProdutos>'SELECT
E.I.value('(../@Produto)[1]','NVARCHAR(20)') As Produto,
E.I.value('.','VARCHAR(100)') As Preco,
E.I.value('(../Desconto)[1]','VARCHAR(100)') As Desconto
FROM @xml.nodes('./ExportacaoDeProdutos/Item/Preco') E(I)[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Gustavo Maia Aguiar quinta-feira, 21 de julho de 2011 20:50
- Marcado como Resposta Fabrizzio CaputoModerator quinta-feira, 21 de julho de 2011 21:00
-
Gustavo,
Assim o retorno esta perfeito, mas fiquei com uma duvida:
Por que o .. para desconto? colocando o .. eu não estaria voltando ao pai dele? no caso item....
EDIT: Entendi, voce esta voltando ao pai item, e depois descendo novamente ao filho que é desconto, perfeito, vlw gustavo, jaja fico mais alguma duvida e posto aqui rs
Fabrizzio A. Caputo
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCTS SQL Server 2008
Developer Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com
-
Oi Fabrizzio,
É exatamente isso. Como o caminho foi feito até o filho (Preco), tive de voltar ao Pai para depois descer ao primeiro elemento "Desconto". No seu caso funcionou porque só há um elemento desconto. Se houvesse mais de um teríamos um pouco mais de dificuldade e precisaríamos utilizar algumas funções de eixo além da relação "Pai e Filho", procuraríamos os "irmãos e primos" (sibling), mas não foi o caso.
O assunto XML é um assunto que gosto e me identifico (embora não tenha tanto tempo quanto gostaria para estudá-lo). O amigo Péricles consolidou vários artigos de minha autoria relacionados a XML. Caso você se interesse, o download pode ser feito no link abaixo (ou no meu blog):
http://blogsqlserver.blogspot.com/2010/12/compendio-xml.html
Acredito que você irá achar a leitura bem interessante.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress.com
Classifique as respostas. O seu feedback é imprescindível