terça-feira, 31 de agosto de 2010

XML com OPENXML

Em artigos anteriores, exemplifiquei como transformar XML fragments em Datasets utilizando a função nodes do type XML. Porém, existe uma outra forma de realizar esta tarefa utilizando a função OPENXML. Como existem diferentes tipos de XML, existe mais de uma maneira de utilizar o OPENXML. Veja o exemplo abaixo, com um fragmento de XML do tipo ELEMENTS:

DECLARE @XML XML
DECLARE @POINTER INT

SELECT @XML='

Óculos


Telefone


Celular

'

EXECUTE SP_XML_PREPAREDOCUMENT @POINTER OUTPUT, @XML

SELECT DESCRICAO FROM
OPENXML(@POINTER,'/ESTOQUE/ITEM',2)
WITH (DESCRICAO VARCHAR(100))

EXEC SP_XML_REMOVEDOCUMENT @Pointer


E agora um outro exemplo onde as tags apresentam atributos. Repare com atenção na diferente implementação do comando WITH:

DECLARE @XML XML
DECLARE @POINTER INT

SELECT @XML='




'

EXECUTE SP_XML_PREPAREDOCUMENT @POINTER OUTPUT, @XML

SELECT DESCRICAO, VALOR FROM
OPENXML(@POINTER,'/ESTOQUE/ITEM',2)
WITH (DESCRICAO VARCHAR(100) '@DESCRICAO',VALOR NUMERIC(10,2) '@VALOR')

EXEC SP_XML_REMOVEDOCUMENT @Pointer


Observe que os dois exemplos, utilizam a procedure SP_XML_PREPAREDOCUMENT que faz o parse do fragmento de XML passado como parâmetro utilizando o MSXML parser (Msxmlsql.dll) colocando o fragmento em um “estado” pronto para consumo. Como o MSXML parser joga esta alocação para memória, é necessário rodar a procedure sp_xml_removedocument para desalocar este ponteiro.

Até a próxima!

Nenhum comentário:

Postar um comentário

Leave your comment here!