none
Condição envolvendo coluna XML onde um node existe mas não possui um elemento filho específico RRS feed

  • Pergunta

  • Prezados,

    tenho uma tabela com uma coluna do tipo XML e que guarda um conteúdo assim:

    <root>
      <nome>Juliano</nome>
      <grupo tipo="A" id="01">
        <funcao>
          <item chave="001" />
        </funcao>
      </grupo>
      <grupo tipo="C" id="02">
    
      </grupo>
      <grupo tipo="A" id="03">
    
      </grupo>
    </root>

    Preciso buscar os itens da tabela (considerando apenas um campo ID e XmlData), onde o elemento grupo possua um atributo tipo com valor igual a "A" e os filhos funcao/item não existam.

    Tentei com o exist da forma abaixo, mas acho que o OR não é permitido.

    SELECT *
    FROM Tabela AS T
    WHERE T.XmlData.exist('/ROOT/grupo[tipo = "A" OR tipo = "C" AND not(funcao)]') = 1


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    quinta-feira, 31 de maio de 2018 18:24

Respostas

  • Juliano,

    Talvez através da linguagem XQuery você consiga realizar este procedimento, veja se o exemplo abaixo pode te dar uma luz:

    declare @dadosxml xml
    
    set @dadosxml = '<?xml version="1.0"?>
    
    <root>
    
    <cliente id="1">
    
    <prod id="321"/>
    
    <prod id="543"/>
    
    <prod id="762"/>
    
    <prod id="325"/>
    
    </cliente>
    
    <cliente id="2">
    
    <prod id="289"/>
    
    <prod id="776"/>
    
    <prod id="335"/>
    
    <prod id="1020"/>
    
    </cliente>
    
    </root>'
    
    --print convert(nvarchar(4000),@dadosxml)
    
    SELECT
    
    t.c.value('../@id[1]','int') as IdCliente,
    
    t.c.value('@id[1]','int') as IdProduto
    
    FROM
    
    @dadosxml.nodes('/root/cliente/prod') as t(c)
    
    dECLARE @x xml 
    SET @x='<Root>
        <row id="1"><name>Larry</name><oflw>some text</oflw></row>
        <row id="2"><name>moe</name></row>
        <row id="3" />
    </Root>'
    SELECT T.c.query('.') AS result
    FROM   @x.nodes('/Root/row') T(c)
    GO
    


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 1 de junho de 2018 12:13
  • Bom dia,

    Juliano, experimente fazer uns testes dessa forma:

    WHERE T.XmlData.exist('/root/grupo[@tipo = ("A", "C") AND not(funcao)]') = 1

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 1 de junho de 2018 14:18

Todas as Respostas

  • Juliano,

    Talvez através da linguagem XQuery você consiga realizar este procedimento, veja se o exemplo abaixo pode te dar uma luz:

    declare @dadosxml xml
    
    set @dadosxml = '<?xml version="1.0"?>
    
    <root>
    
    <cliente id="1">
    
    <prod id="321"/>
    
    <prod id="543"/>
    
    <prod id="762"/>
    
    <prod id="325"/>
    
    </cliente>
    
    <cliente id="2">
    
    <prod id="289"/>
    
    <prod id="776"/>
    
    <prod id="335"/>
    
    <prod id="1020"/>
    
    </cliente>
    
    </root>'
    
    --print convert(nvarchar(4000),@dadosxml)
    
    SELECT
    
    t.c.value('../@id[1]','int') as IdCliente,
    
    t.c.value('@id[1]','int') as IdProduto
    
    FROM
    
    @dadosxml.nodes('/root/cliente/prod') as t(c)
    
    dECLARE @x xml 
    SET @x='<Root>
        <row id="1"><name>Larry</name><oflw>some text</oflw></row>
        <row id="2"><name>moe</name></row>
        <row id="3" />
    </Root>'
    SELECT T.c.query('.') AS result
    FROM   @x.nodes('/Root/row') T(c)
    GO
    


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 1 de junho de 2018 12:13
  • Bom dia,

    Juliano, experimente fazer uns testes dessa forma:

    WHERE T.XmlData.exist('/root/grupo[@tipo = ("A", "C") AND not(funcao)]') = 1

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 1 de junho de 2018 14:18