none
Selecionar valores do XML? RRS feed

  • Pergunta

  • Bom dia Pessoal estou com o seguinte problema:

    Tenho que passar para uma procedure um  xml mais ou menos na seguinte estrutura:

    <tabela1>
    <campo1>123</campo1>
    <campo1>456</campo1>
    <campo1>789</campo1>
    </tabela1>
    <tabela2>
    <campo1>abc</campo1>
    <campo1>xyz</campo1>
    </tabela2>...

    Ao receber esse xml na procedure, pretendo identificar as tags com os nomes das tabelas e campos para fazer o insert, pois as tags serão enviadas com os nomes das tabelas, assim como os referidos campos.

    Poderiam me ajudar como posso fazer para capturar os valores do xml para inserir em cada tabela?


    domingo, 14 de julho de 2013 03:36

Respostas

  • Bernoulthy,

    Essa estrutura do XML foi criada por voce ou será efetivamente o XML enviado? Pois a mesma está violando algumas boas praticas de contrução de XML alem de complicar um pouco os selects.

    Em relação a seu exemplo, da para fazer mas voce terá de ficar filtrando a variavel xml, um exemplo de leitura simples (Sem a tratativa do looping) é:

    DECLARE @xml XML
    SET @xml =
    '
    <xml>
    <tabela1>
    	<campo1>123</campo1>
    	<campo2>456</campo2>
    	<campo3>789</campo3>
    </tabela1>
    <tabela2>
    	<campo1>321</campo1>
    	<campo2>654</campo2>
    	<campo3>987</campo3>
    </tabela2>
    </xml>
    '
    
    SELECT
    X.VALOR.value('campo1[1]', 'nvarchar(50)') As Campo1,
    X.VALOR.value('campo2[1]', 'nvarchar(50)') As Campo2,
    X.VALOR.value('campo3[1]', 'nvarchar(50)') As Campo3
    FROM @xml.nodes('/xml/tabela1') X(VALOR)

    Agora, aplicando as boas praticas:

     - Colocar uma tag de controle no seu xml abrindo e fechando todo o arquivo;

     - Tudo são tabelas e campos, ou seja, estamos falando de uma mesma estrutura de objeto apenas com variação nos nomes e quantidades de colunas, então o XML que eu sugiro é:

    <xml>
    <tabela nome="Tabela1">
    	<campo nome="Campo1" valor="123"/>
    	<campo nome="Campo2" valor="456"/>
    	<campo nome="Campo3" valor="789"/>
    </tabela>
    <tabela nome="Tabela2">
    	<campo nome="Campo1" valor="321"/>
    	<campo nome="Campo2" valor="654"/>
    	<campo nome="Campo3" valor="987"/>
    </tabela>
    </xml>

    - Trabalhe com atirbutos, assim a visualização fica mais clara e o retorno se da em lista, sem a necessidade de tratativa de nulos.

    Desta forma o XML e o select ficariam desta forma:

    DECLARE @xml XML
    SET @xml =
    '
    <xml>
    <tabela nome="Tabela1">
    	<campo nome="Campo1" valor="123"/>
    	<campo nome="Campo2" valor="456"/>
    	<campo nome="Campo3" valor="789"/>
    </tabela>
    <tabela nome="Tabela2">
    	<campo nome="Campo1" valor="321"/>
    	<campo nome="Campo2" valor="654"/>
    	<campo nome="Campo3" valor="987"/>
    </tabela>
    </xml>
    '
    
    SELECT
    X.VALOR.value('../@nome[1]', 'nvarchar(50)') As Tabela,
    X.VALOR.value('@nome[1]', 'nvarchar(50)') As Campo,
    X.VALOR.value('@valor[1]', 'nvarchar(50)') As Campo
    FROM @xml.nodes('/xml/tabela/campo') X(VALOR)


    Fabrizzio A. Caputo
    Certificações:
    MCT
    MCC
    Oracle OCA 11g
    MCTS SQL Server 2008 BI
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    • Sugerido como Resposta Alexandre Matayosi segunda-feira, 15 de julho de 2013 14:08
    • Marcado como Resposta Bernoulthy terça-feira, 17 de junho de 2014 02:17
    segunda-feira, 15 de julho de 2013 12:00
    Moderador