none
Outro select em XML RRS feed

  • 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
    quinta-feira, 21 de julho de 2011 20:11
    Moderador

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
    quinta-feira, 21 de julho de 2011 20:50

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
    quinta-feira, 21 de julho de 2011 20:50
  • 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

    quinta-feira, 21 de julho de 2011 20:59
    Moderador
  • 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
    quinta-feira, 21 de julho de 2011 22:07