none
SQL Server 2005 montando um xml RRS feed

  • Pergunta

  • Olá, estou com um problema pequeno,
    estou estudando XML no momento eu quero transformar de XML para uma tabela

    DECLARE @HDOC  INT
    DECLARE @HDOCT XML

    SET @HDOCT = '<Production LocationID="1">
                  <Usuarios>
                     <Usuario Preco="17" Quantity="2"><UsuarioName>User1</UsuarioName></Usuario>
                     <Usuario Preco="15" Quantity="4"><UsuarioName>User2</UsuarioName></Usuario>
                  </Usuarios>
                  </Production>'
                   

    exec sp_xml_preparedocument @HDOC OUTPUT, @HDOCT

    SELECT * FROM OPENXML(@HDOC,'/Production/Usuarios/Usuario',1)
    WITH (Preco int, Quantity int, UsuarioName nvarchar(20))

    só que: o UsuarioName, não apareçe, está como null..
    o problema seria apenas isso.
    sexta-feira, 16 de janeiro de 2009 16:26

Respostas

  • Lucas,

     

    Concordo com o Gustavo, o OpenXML, foi uma implementação criada no SQL Server 2000, com o SQL Server 2005 a Microsoft definiu uma nova linguagem especifica para trabalhar com XML, mais conhecida como XQuery.

     

    Fazendo uso da claúsula Nodes para poder capturar os dados existentes dentro das tags XML.

     

    Veja abaixo o código de exemplo:

     

    Code Snippet

    declare @dadosxml xml

     

    set @dadosxml = '<?xml version="1.0"?>

    <root>

    <cliente id="1">

    <prod id="321"/>

    <prod id="543"/>

    <prod id="762"/>

    <prod id="325"/>

    </cliente>

    <cliente id="2">

    <prod id="289"/>

    <prod id="776"/>

    <prod id="335"/>

    <prod id="1020"/>

    </cliente>

    </root>'

     

    --Print convert(nvarchar(4000),@dadosxml)

    SELECT t.c.value('../@id[1]','int') as IdCliente,

                 t.c.value('@id[1]','int') as IdProduto

    FROM @dadosxml.nodes('/root/cliente/prod') as t(c)

     

    DECLARE @x xml
    SET @x='<Root>
        <row id="1"><name>Larry</name><oflw>some text</oflw></row>
        <row id="2"><name>moe</name></row>
        <row id="3" />
    </Root>'


    SELECT T.c.query('.') AS result
    FROM   @x.nodes('/Root/row') T(c)
    GO

     

     

    sexta-feira, 16 de janeiro de 2009 16:57
  • Oi Jr.

     

    Foi o que eu imaginei. É só pra não passar em branco.

     

    Abs,

    sexta-feira, 16 de janeiro de 2009 17:31

Todas as Respostas

  • Olá Lucas,

     

    Considerando que estamos falando do SQL Server 2005, eu não recomendo que você utilize o OPENXML. Além de mais lento é mais limitado. Pesquise pelo método Nodes. Ex:

    Code Snippet

     

    -- Declarando uma variável do tipo de dados XML

    -- Teste do método nodes

    DECLARE @Pessoa XML

    SET @Pessoa =

    N'<Pessoa Nome="Paula">

    <Telefone Tipo="Celular" DDD="061" Num="8177-9634"/>

    <Telefone Tipo="Residencial" DDD="061" Num="3210-2370"/>

    <Telefone Tipo="Trabalho" Num="4004-0001"/>

    </Pessoa>'

    SELECT

    Pessoa.Telefones.value('../@Nome','nvarchar(30)')

    As Nome,

    Pessoa.Telefones.value('@Tipo','nvarchar(20)')

    As Tipo,

    Pessoa.Telefones.value('@DDD','nchar(3)')

    As DDD,

    Pessoa.Telefones.value('@Num','nchar(9)')

    As Numero

    FROM

    @Pessoa.nodes('/Pessoa/Telefone') Pessoa(Telefones)

     

     

    Você poderá conhecer mais sobre os métodos XML nos links abaixo:

     

    SQL Server 2005 New Features: Os métodos XML - Parte 1
    http://www.plugmasters.com.br/sys/materias/773/1/SQL-Server-2005-New-Features%3A-Os-m%E9todos-XML---Parte-1


    SQL Server 2005 New Features: Os métodos XML - Parte 2
    http://www.plugmasters.com.br/sys/materias/799/1/SQL-Server-2005-New-Features%3A-Os-m%E9todos-XML---Parte-2

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

    sexta-feira, 16 de janeiro de 2009 16:43
  • Lucas,

     

    Concordo com o Gustavo, o OpenXML, foi uma implementação criada no SQL Server 2000, com o SQL Server 2005 a Microsoft definiu uma nova linguagem especifica para trabalhar com XML, mais conhecida como XQuery.

     

    Fazendo uso da claúsula Nodes para poder capturar os dados existentes dentro das tags XML.

     

    Veja abaixo o código de exemplo:

     

    Code Snippet

    declare @dadosxml xml

     

    set @dadosxml = '<?xml version="1.0"?>

    <root>

    <cliente id="1">

    <prod id="321"/>

    <prod id="543"/>

    <prod id="762"/>

    <prod id="325"/>

    </cliente>

    <cliente id="2">

    <prod id="289"/>

    <prod id="776"/>

    <prod id="335"/>

    <prod id="1020"/>

    </cliente>

    </root>'

     

    --Print convert(nvarchar(4000),@dadosxml)

    SELECT t.c.value('../@id[1]','int') as IdCliente,

                 t.c.value('@id[1]','int') as IdProduto

    FROM @dadosxml.nodes('/root/cliente/prod') as t(c)

     

    DECLARE @x xml
    SET @x='<Root>
        <row id="1"><name>Larry</name><oflw>some text</oflw></row>
        <row id="2"><name>moe</name></row>
        <row id="3" />
    </Root>'


    SELECT T.c.query('.') AS result
    FROM   @x.nodes('/Root/row') T(c)
    GO

     

     

    sexta-feira, 16 de janeiro de 2009 16:57
  • ta ok então, quer dizer que, no lugar de eu utilizar o openxml, posso utilizar o nodes, mais o nodes trás tudo que o openxml trás?
    sexta-feira, 16 de janeiro de 2009 17:03
  • Olá Lucas Souza Saraivaa,

     

    O Nodes faz tudo o que o OpenXML faz e consegue fazer coisas que o OPENXML não faz. A única coisa que o OPENXML faz que o Nodes não faz é ser mais lento e gastar mais memória.

     

    Recomendo não utilizá-lo. Parta para o Nodes e os demais métodos (Query, Value, Exist, etc).

     

    Os artigos que citei explanam bem sobre esse assunto.

     

    Gostaria de dizer também que o tipo de dados XML baseia-se em XPath e XQuery, mas que esses padrões não foram definidos pela Microsoft. Eles são criados pelo W3C e a Microsoft implementou a recomendação W3C. Isso é interessante, pois, em tese, a mesma expressão XPath ou XQuery pode ser utilizada em outros produtos que usam o XML. 

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

     

    sexta-feira, 16 de janeiro de 2009 17:10
  • Maia,

     

    Você esta certo, quando destaquei que a Microsoft definiu o XQuery como linguagem para trabalhar com XML, me esqueci de dizer que o W3C foi com criado.

     

    Obrigado pelo lembrete.

    sexta-feira, 16 de janeiro de 2009 17:15
  • Oi Jr.

     

    Foi o que eu imaginei. É só pra não passar em branco.

     

    Abs,

    sexta-feira, 16 de janeiro de 2009 17:31