none
XML RRS feed

  • Pergunta

  • Tenho que receber um xml em uma procedure. Carrega-lo em duas tabelas (header e detail),

    Criticar os dados e se tudo estiver ok, salvar os dados na tabela de produção com consistencia trasacional.

    Ate ai tudo bem.

    O problema é que o programdor vb.net esta me passando o xml na estrutura abaixo:

    <clsConta xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <ContaDetalhe>
                 <clsContaDetalhe>
                              <Nome>TESTE FELIPE 2</Nome>
                              <IDPlanoConta>49239</IDPlanoConta>
                              <Valor>5000</Valor>
                 </clsContaDetalhe>
                 <clsContaDetalhe>
                              <Nome>TESTE FELIPE 2</Nome>
                              <IDPlanoConta>49239</IDPlanoConta>
                              <Valor>5000</Valor>
                 </clsContaDetalhe>
           </ContaDetalhe>

           <IDCentroCusto>3</IDCentroCusto>
           <Nome>CONTA TESTE FELIPE</Nome>
           <Vencimento>2012-03-14T00:00:00-03:00</Vencimento>
           <Pagamento>2012-03-14T00:00:00-03:00</Pagamento>
           <Valor>5000</Valor>
           <Juros>2</Juros>
           <Mora>1</Mora>
           <Responsavel>-1</Responsavel>
     <GUID />
    </clsConta>'

    E eu preferia no formato:

    '
    <ROOT>
    <Customer CustomerID="VINET" ContactName="Paul Henriot">
       <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
          <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
          <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
       </Order>
    </Customer>
    <Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
       <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
          <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
       </Order>
    </Customer>
    </ROOT>'

    A diferença pricipal é o formato de atribuiçao. Com o igual para atribuir os valores as colunas.
    Uso nodes para transformar o segundo exmplo em tabelas. Ja no primeiro formato, so consegui usando a funcao
    sp_xml_preparedocument. E nao sei se esta funcao é uma boa opçao.
    Porderiam comentar, por favor? 
    Obrigado.

    • Movido Gustavo Maia Aguiar terça-feira, 20 de março de 2012 04:06 (De:SQL Server - Desenvolvimento Geral)
    quinta-feira, 15 de março de 2012 14:37

Todas as Respostas

  • CeiltonLM,

    A sp_xml_preparedocument é uma stored procedure existente desde a versão 2000 do SQL Server, muito utilizada em conjunto com o padrão OpenXML nativo desta versão.

    Normalmente para fazer uso da mesma, você tem que estabelecer uma padrão de documento XML para poder reconhecer a sua estrutura.

    Por padrão ela, lê o texto XML fornecido como entrada, analisa o texto usando o analisador MSXML (Msxmlsql.dll) e fornece o documento analisado em um estado pronto para consumo. Esse documento analisado é uma representação em árvore dos vários nós no documento XML: elementos, atributos, texto, comentários e assim por diante.

    Além disso ela possui um limite de elementos abertos de uma única vez, podendo no máximo apresentar 256 elementos.

    O formato que você esta querendo também pode ser utilizando no padrão OpenXML, fazendo uso da estrutura de árvore de elementos, através do nó <Root>

    Esta estrutura com base no <ROOT> você estará trabalhando com o seu conjunto XML sendo armazenado em uma variável do tipo Varchar.

    Gostaria de saber como o seu primeiro formato XML esta sendo gerado? Existe alguma aplicação que você esta utilizando?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quinta-feira, 15 de março de 2012 18:07
  • Bom Dia,

    Eu particularmente não recomendo o uso da sp_xml_preparedocument. É legado, usa objetos COM externos ao SQL Server e se você esquecer de fechar o ponteiro, o memory leak é garantido.

    Sugiro mais detalhes em:

    Compêndio de XML – Preparação para o exame 70-433 – MCTS Microsoft SQL Server 2008 – Database Development
    http://gustavomaiaaguiar.wordpress.com/2010/12/17/compendio-de-xml-%E2%80%93-preparacao-para-o-exame-70-433-mcts-microsoft-sql-server-2008-database-development/

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    sexta-feira, 16 de março de 2012 12:47
  • Galvão,

    É gerado por um de nossos programadores no Visual Studio 2010.

    Uma Windows Aplication Visual Basic.Net.

    Nao sei qual objeto do grame work ele usa. Mas posso verificar se necessario.

    O programador me mandou o arquivo XML para uma inclusao em que deve ser garantida a unicidade da transacao.

    Nao gostei do formato. Preferia a forma:

    <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
          <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>

    Acredito que assim me facilitaria o uso OpenXML e as funcoes de nodes.


    • Editado CeiltonLM segunda-feira, 19 de março de 2012 21:58
    segunda-feira, 19 de março de 2012 21:55
  • Obrigado Gustavo.

    Lerei o material.


    • Editado CeiltonLM segunda-feira, 19 de março de 2012 21:58
    segunda-feira, 19 de março de 2012 21:56
  • Ceilton,

    Cara, o Visual Studio 2010 com certeza vai oferecer outros recursos e tecnologias bem mais atuais do que a sp_preparedocument.

    Se não estou enganado dentro do próprio VS2010 você poderá criar suas estruturas xml de forma simples e rápida.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 28 de março de 2012 16:24