none
XQuery - Percorrer Xml com condição - Urgente RRS feed

  • Pergunta

  • Bom dia!

    Tenho postado várias dúvidas sobre Xquery, é mto novo pra mim!

    Preciso de ajuda!

    Tenho um campo na base de dados sql server (2008) assim:

    <GridResposta>
      <DadosGrid>
        <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet">
          <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="AbrangenciaGeo" msdata:UseCurrentLocale="true">
            <xs:complexType>
              <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="AbrangenciaGeo">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element name="Estado" type="xs:int" minOccurs="0" />
                      <xs:element name="Cidade" type="xs:int" minOccurs="0" />
                      <xs:element name="Bairro" type="xs:string" minOccurs="0" />
                    </xs:sequence>
                  </xs:complexType>
                </xs:element>
              </xs:choice>
            </xs:complexType>
          </xs:element>
        </xs:schema>
        <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
          <DocumentElement>
            <AbrangenciaGeo diffgr:id="AbrangenciaGeo1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
              <Estado>25</Estado>
              <Cidade>5362</Cidade>
              <Bairro>JD.Marajoara</Bairro>
            </AbrangenciaGeo>

            <AbrangenciaGeo diffgr:id="AbrangenciaGeo1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
              <Estado>80</Estado>
              <Cidade>2354</Cidade>
              <Bairro>JD.São Matheus</Bairro>
            </AbrangenciaGeo>
            
          </DocumentElement>
        </diffgr:diffgram>
      </DadosGrid>
    </GridResposta>


    O problema é o seguinte, eu preciso percorrer esse xml, e além disso, preciso verificar quando o atributo for Estado, eu concateno um valor, quando o atributo for Cidade eu concateno outro valor.

    Eu tenho o seguinte código:

    select      
          rq.dsc_resp_xml.query('                  
                for $linha in //DocumentElement/*
                            for $coluna in $linha/*
                                return if ($coluna is $linha/*[last()])                             
                                       then concat(string($coluna), " | ")
                                       else concat(string($coluna), ", ")
          ')
          from t_resposta_questionario rq where rq.cod_resposta_questionario = 184
          
          
    Mas esse código me retorna isso:

    25,  5362,  JD.Marajoara |  80, 2354, JD.São Matheus

    Eu preciso que seja retornado pra mim o seguinte:

    25 !,  5362 #,  JD.Marajoara *|  80 !, 2354 #, JD.São Matheus *|

    Como eu percorro os atributos, um por um???

    Obrigada, aguardo resposta, o mais breve possível!


    Simone Trevenzoli

    sexta-feira, 16 de março de 2012 12:27

Respostas

  • Simone,

    não sei se entendi bem a sua necessidade, mas de qualquer forma, vou tentar rsrsr. Segue exemplo:

    Declare @xml as xml
    --
    set @xml = '<GridResposta>
       <DadosGrid>
         <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet">
           <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="AbrangenciaGeo" msdata:UseCurrentLocale="true">
             <xs:complexType>
               <xs:choice minOccurs="0" maxOccurs="unbounded">
                 <xs:element name="AbrangenciaGeo">
                   <xs:complexType>
                     <xs:sequence>
                       <xs:element name="Estado" type="xs:int" minOccurs="0" />
                       <xs:element name="Cidade" type="xs:int" minOccurs="0" />
                       <xs:element name="Bairro" type="xs:string" minOccurs="0" />
                     </xs:sequence>
                   </xs:complexType>
                 </xs:element>
               </xs:choice>
             </xs:complexType>
           </xs:element>
         </xs:schema>
         <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
           <DocumentElement>
             <AbrangenciaGeo diffgr:id="AbrangenciaGeo1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
               <Estado>25</Estado>
               <Cidade>5362</Cidade>
               <Bairro>JD.Marajoara</Bairro>
             </AbrangenciaGeo>
     
            <AbrangenciaGeo diffgr:id="AbrangenciaGeo1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
               <Estado>80</Estado>
               <Cidade>2354</Cidade>
               <Bairro>JD.São Matheus</Bairro>
             </AbrangenciaGeo>
            
           </DocumentElement>
         </diffgr:diffgram>
       </DadosGrid>
     </GridResposta>'
    --
    Declare @Resultado Varchar(Max)
    --
    Set @Resultado = ''
    --      
    select  @Resultado = @Resultado + c.value ('(Estado)[1]','varchar(50)') + ' !, ' +
          c.value ('(Cidade)[1]','varchar(50)') + ' #, '  +
          c.value ('(Bairro)[1]','varchar(50)') + ' *| '

    From    @xml.nodes('//DocumentElement/*') T(c)
    --
    Select @Resultado
          
          
     


    Espero que ajude! Luiz Phellipe

    sábado, 17 de março de 2012 00:23

Todas as Respostas

  • Simone,

    não sei se entendi bem a sua necessidade, mas de qualquer forma, vou tentar rsrsr. Segue exemplo:

    Declare @xml as xml
    --
    set @xml = '<GridResposta>
       <DadosGrid>
         <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet">
           <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="AbrangenciaGeo" msdata:UseCurrentLocale="true">
             <xs:complexType>
               <xs:choice minOccurs="0" maxOccurs="unbounded">
                 <xs:element name="AbrangenciaGeo">
                   <xs:complexType>
                     <xs:sequence>
                       <xs:element name="Estado" type="xs:int" minOccurs="0" />
                       <xs:element name="Cidade" type="xs:int" minOccurs="0" />
                       <xs:element name="Bairro" type="xs:string" minOccurs="0" />
                     </xs:sequence>
                   </xs:complexType>
                 </xs:element>
               </xs:choice>
             </xs:complexType>
           </xs:element>
         </xs:schema>
         <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
           <DocumentElement>
             <AbrangenciaGeo diffgr:id="AbrangenciaGeo1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
               <Estado>25</Estado>
               <Cidade>5362</Cidade>
               <Bairro>JD.Marajoara</Bairro>
             </AbrangenciaGeo>
     
            <AbrangenciaGeo diffgr:id="AbrangenciaGeo1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
               <Estado>80</Estado>
               <Cidade>2354</Cidade>
               <Bairro>JD.São Matheus</Bairro>
             </AbrangenciaGeo>
            
           </DocumentElement>
         </diffgr:diffgram>
       </DadosGrid>
     </GridResposta>'
    --
    Declare @Resultado Varchar(Max)
    --
    Set @Resultado = ''
    --      
    select  @Resultado = @Resultado + c.value ('(Estado)[1]','varchar(50)') + ' !, ' +
          c.value ('(Cidade)[1]','varchar(50)') + ' #, '  +
          c.value ('(Bairro)[1]','varchar(50)') + ' *| '

    From    @xml.nodes('//DocumentElement/*') T(c)
    --
    Select @Resultado
          
          
     


    Espero que ajude! Luiz Phellipe

    sábado, 17 de março de 2012 00:23
  • Obrigada, era isso que eu precisava!

    Simone Trevenzoli

    domingo, 18 de março de 2012 20:18