Usando OPENXML – Parte 1

 

por Jerônimo Jardel Vogt

Nos artigos anteriores falamos sobre a cláusula de consulta FOR XML e os diferentes modos RAW, AUTO, EXPLICIT e PATH, suportada pelo SQL Server 2005 e usada para retornar dados do banco de dados em formato XML. Nesse artigo, descreveremos o uso da função OPENXML, que nos permite fazer justamente o inverso, que é transformar um documento XML em um conjunto de linhas (rowset) a serem inseridas em uma ou mais tabelas no banco de dados.

Como processar um documento XML

A seguir, descrevemos os passos envolvidos no processo de transformação de dados XML para dados relacionais:

1.      Receber um documento XML. Quando uma aplicação recebe um documento XML, ela pode processar esse documento usando código Transact-SQL. Normalmente, o código Transact-SQL é implementado em forma de uma stored procedure, e a string XML é passada como um parâmetro.

2.      Gerar uma representação de árvore interna. Use a stored procedure sp_xml_preparedocument para fazer o parse do documento XML e transformá-lo em uma estrutura de árvore em memória antes de processar esse documento. Conceitualmente, a árvore é similar a uma representação DOM (Document Object Model) do documento XML, e você pode usar apenas documentos XML válidos e bem formados para gerar essa árvore interna.

3.      Retornar um conjunto de linhas. Você usa a função OPENXML para gerar um conjunto de linhas em memória, dos dados da árvore XML. Use a sintaxe de consulta XPath para especificar os nós da árvore a serem retornados no rowset.

4.      Processar os dados do rowset. Use o rowset criado pelo OPENXML para processar os dados, da mesma maneira que você faria com qualquer outro rowset. Você pode manipular os dados através dos comandos Transact-SQL de select, insert, update ou delete. O uso mais comum do OPENXML é inserir os dados do rowset em tabelas permanentes no banco de dados.

5.      Destruir a representação de árvore interna. Como a estrutura de árvore do documento XML é mantido em memória, use a stored procedure sp_xml_removedocument para liberar a memória quando essa árvore não for mais necessária.

A figura abaixo demonstra o processo.

15-01-07pic.JPG 

 

Portanto, como vimos até aqui, antes de processar qualquer documento XML através de comandos Transact-SQL, precisamos fazer o parse do documento e transformá-lo em uma estrutura de árvore em memória. Descrevemos a seguir as stored procedures responsáveis por gerenciar os nós da árvore XML em memória.

Criando a árvore usando sp_xml_preparedocument

A stored procedure sp_xml_preparedocument faz o parse de um documento XML e gera uma representação de árvore interna desse documento. A tabela a seguir descreve os parâmetros da stored procedure de sistema sp_xml_preparedocument.

 

Parâmetro

Descrição

xmltext

É o documento XML original a ser processado. Esse parâmetro aceita qualquer um dos seguintes tipos de dado texto: nchar, varchar, nvarchar, text, ntext, ou xml.

hdoc

É um handle de retorno do parse do documento XML, usado para referenciar a árvore em memória.

xpath_namespaces

(Opcional) Especifica as declarações de namespace que são usadas nas expressões XPath de linha e coluna na função OPENXML. Ë um parâmetro texto do tipo char, nchar, varchar, nvarchar, text, ntext ou xml.

 

O exemplo abaixo mostra como usar a stored procedure sp_xml_preparedocument para fazer o parse de um fragmento XML.

 


            DECLARE @hdoc int
            DECLARE @doc varchar(1000)
            SET @doc =
            
            <CUSTOMER ContactName="Paul Henriot" CustomerID="VINET">
            <ORDER CustomerID="VINET" OrderDate="1996-07-04T00:00:00" EmployeeID="5">
            <ORDERDETAIL ProductID="11" Quantity="12" OrderID="10248" />
            <ORDERDETAIL ProductID="42" Quantity="10" OrderID="10248" />
            
            </CUSTOMER>
            <CUSTOMER ContactName="Carlos Gonzlez" CustomerID="LILAS">
            <ORDER CustomerID="LILAS" OrderDate="1996-08-16T00:00:00" EmployeeID="3">
            <ORDERDETAIL ProductID="72" Quantity="3" OrderID="10283" />
            
            </CUSTOMER>
            
            
            EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc
        

Removendo a árvore usando sp_xml_removedocument

Como o SQL Server armazena o documento no cache interno, devemos usar uma outra stored procedure de sistema, sp_xml_removedocument, para destruir a estrutura de árvore quando essa não é mais usada, a fim de liberar a memória usada.

Você deve chamar a sp_xml_removedocument no mesmo batch do comando sp_xml_preparedocument usado para gerar a árvores de nós XML. Isto porque o parâmetro hdoc usado para referenciar a árvore é uma variável local, e se estiver fora de escopo, não será possível remover a árvore da memória.

O exemplo abaixo mostra como usar a stored procedure sp_xml_removedocument:


            EXEC sp_xml_removedocument @hdoc
        

No próximo artigo, descreveremos a sintaxe e o uso da função OPENXML, responsável por gerar um rowset do documento que foi feito o parse para memória. Um grande abraço e até lá.