none
DISTINCT e XML RRS feed

  • Pergunta

  • Galera,

     

    Tenho que importar um arquivo xml. Até aí blz. Mas é que esse XML vai gravar em várias tabelas e eu precisaria tirar alguns valores com o distinct antes. Alguém sabe como usar o distinct com XML ?

     

    Valews,

    quinta-feira, 27 de dezembro de 2007 21:50

Respostas

  • Boa Noite,

     

    Existem duas formas de se fazer isso. Você pode optar por uma extração e aplicar um DISTINCT posteriormente ou utilizar a própria XQUERY para fazer esse filtro. Baseando-me no seu exemplo, seguem duas possíveis soluções:

     

    Solução 1

    declare @dados xml

    set @dados = '

    <reservas>

    <reserva id="15232" data="2007-12-27" cliente="501" local="36"/>

    <reserva id="15234" data="2007-12-27" cliente="609" local="49"/>

    <reserva id="15237" data="2007-12-27" cliente="129" local="36"/>

    <reserva id="15238" data="2007-12-27" cliente="769" local="77"/>

    <reserva id="15239" data="2007-12-27" cliente="326" local="10"/>

    </reservas>'

     

    select distinct reservas.reserva.value('@local[1]', 'int') as local

    from @dados.nodes('/reservas/reserva') reservas(reserva)

    order by local

     

    Solução 2

    declare @dados xml

    set @dados = '

    <reservas>

    <reserva id="15232" data="2007-12-27" cliente="501" local="36"/>

    <reserva id="15234" data="2007-12-27" cliente="609" local="49"/>

    <reserva id="15237" data="2007-12-27" cliente="129" local="36"/>

    <reserva id="15238" data="2007-12-27" cliente="769" local="77"/>

    <reserva id="15239" data="2007-12-27" cliente="326" local="10"/>

    </reservas>'

     

    declare @dadosaux xml

    set @dadosaux =

    (select @dados.query('

    for $local in fnBig Smileistinct-values(/reservas/reserva/@local)

    order by $local

    return <local>{$local}</local>'))

     

    select reservas.reserva.value('text()[1]', 'int') as local

    from @dadosaux.nodes('/local') reservas(reserva)

     

    Dizer qual é a mais performática é difícil. Se você tiver uma alta taxa de repetições, é bem provável que a segunda seja mais efetiva. Utilizar o DISTINCT da própria XQuery já retornará com um tempo menor. Não que a XQUERY seja mais ágil, mas é que retornar os resultados em forma de tabela já exigirá a XQUERY e adicionar o DISTINCT da XQUERY será melhor do que usar o DISTINCT da SQL. Se a taxa de repetições for baixa, é provável que o DISTINCT da SQL seja mais efetivo já que lidar com dados é algo que a SQL supera o comportamento procedural FLOWR da XQUERY.

     

    Avaliei o plano de execução para o seu "template" e os resultados foram muito próximos. Talvez com uma carga maior, você possa ter um resultado mais preciso.

     

    [ ]s,

     

    Gustavo

    quinta-feira, 27 de dezembro de 2007 22:19

Todas as Respostas