Usuário com melhor resposta
SQL Server 2005 montando um xml

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.
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 Snippetdeclare @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 -
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 XMLSET
@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 NumeroFROM
@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
-
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 Snippetdeclare @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 -
-
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
-
-