Usuário com melhor resposta
XQuery - Percorrer Xml com condição - Urgente

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
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
- Marcado como Resposta Simone Trevenzoli domingo, 18 de março de 2012 20:18
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
- Marcado como Resposta Simone Trevenzoli domingo, 18 de março de 2012 20:18
-