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.
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á.