Até pouco tempo atrás, os bancos de dados relacionais não suportavam a manipulação de dados XML. Em 2003, o International Organization for Standardization (ISO) e o American National Standards Institute (ANSI) liberaram a parte 14 do SQL Standard XML-Related Specifications (SQLXML), que trata da especificação de como bancos de dados relacionais podem trabalhar de forma nativa com dados XML. No SQL Server 2005 essa especificação foi implementada, dando aos administradores e desenvolvedores de banco de dados uma maior flexibilidade em trabalhar com diferentes tipos de dados. Assim, o SQL Server 2005 tem o tipo de dados xml, que permite o armazenamento de documentos XML em tabela, variável ou parâmetro. O tipo de dados xml tem algumas vantagens importantes sobre o armazenamento de dados em campos text ou varchar, incluindo a possibilidade de trabalhar com o Extensible Query Language (XQuery) para modificar ou retornar elementos ou atributos em dados XML. Nesse artigo, descreveremos o tipo de dados xml, suas vantagens e uso. Na segunda parte do artigo, descreveremos os vários métodos do tipo xml, e também como usar XQuery para consultar dados XML.

O que é o tipo de dado xml?

O tipo de dados xml é um tipo de dados nativo para o armazenamento de documentos ou fragmentos XML, com tamanho máximo de até 2 gigabytes (GB). Você pode usá-lo como qualquer outro tipo de dados nativo do SQL Server: definição de colunas em tabelas, parâmetros para funções e stored procedures e na criação de variáveis. Como demonstra o código de exemplo abaixo, a coluna de tipo de dados xml aceita tanto documentos como fragmentos XML.

 
CREATE TABLE ExecutionLog(recordID int, description XML)

INSERT ExecutionLog(recordID, description)

VALUES(1, 'SalesThe connection timed out.')

INSERT ExecutionLog(recordID, description)

VALUES(1, 'database unavailable')
            

Você também pode usar o tipo de dados xml para definir parâmetros e variáveis, como o código exemplo abaixo demonstra.

 
CREATE PROCEDURE AddRecordToLog (@record AS XML)

AS

--corpo da procedure

GO

DECLARE @logRecord AS XML

SET @logRecord = 'SalesThe connection timed out.'

EXEC AddRecordToLog @logRecord
            

O SQL Server converte automaticamente os tipos de dados (n)char, (n)varchar, (n)text, varbinary, e image para xml quando esses valores estiverem sendo passados para um parâmetro, coluna ou variável do tipo xml.

Os benefícios em armazenar dados XML usando um tipo de dados xml no SQL Server 2005 são os seguintes:

  • O tipo xml está completamente integrado com o query engine do SQL Server e todos os outros serviços do SQL Server. O mesmo processador e otimizador de consultas são usados para as consultas relacionais e XML.
  • O dado é armazenado e manipulado como XML de forma nativa.
  • O SQL Server 2005 permite operações de select, insert, alter e delete ao nível do nó xml.
  • Podem-se criar múltiplos índices com o tipo de dados xml, melhorando o desempenho das operações de consulta.
  • A ordem e estrutura do documento são preservadas.

Entre as limitações em usar um tipo xml para armazenamento de dados XML estão:

  • A estrutura textual não é completamente preservada. Espaços em branco, comentários, a declaração XML no topo do documento, a ordem dos atributos e outros elementos nondata são removidos da estrutura.
  • A profundidade máxima de nós permitidos é de 128 níveis.
  • O tamanho máximo de armazenamento permitido é de 2 GB.

Validando dados xml com esquemas xml

O SQL Server 2005 suporta dois tipos de dados XML: untyped e typed. Relacionando uma variável, coluna ou parâmetro do tipo xml a um esquema xml, o SQL Server tem a possibilidade de validar a corretude da instância XML. Um esquema xml descreve a estrutura de um documento XML, assim como provê informações de tipos que descrevem a natureza dos dados nos elementos e atributos. Se um documento XML estiver de acordo como o que está declarado no esquema xml, esse documento é considerado válido. Um documento inválido é quando esse documento não está em conformidade com o que está declarado no esquema xml.

Esquemas xml são declarados em nível de banco de dados, e são de grande importância, pois fornecem ao SQL Server metadados que definem o limite e a natureza dos dados xml. Após criar um esquema xml como mostra o código baixo, você pode validar qualquer coluna, variável ou parâmetro do tipo xml de acordo com esse esquema.

CREATE XML SCHEMA COLLECTION LogRecordSchema AS 
Validando qualquer coluna

No exemplo a seguir, o SQL Server valida o conteúdo da variável @varXML com as regras especificadas em todos os esquemas xml que compõem a coleção de esquema LogRecordSchema.

Validando o conteúdo da variável

Nesse exemplo, a atribuição da variável falha, pois a instância XML não está em conformidade com a estrutura declarada pelo esquema xml.

Em muitos casos, é mais fácil armazenar o esquema xml em um arquivo externo de extensão .xsd e carregar esse esquema xml para uma variável xml com o comando OPENROWSET, como mostra o código exemplo a seguir.


            DECLARE @schema XML

            SELECT @schema = c FROM OPENROWSET (
            
            BULK 'MyXMLSchema.xsd', SINGLE_BLOB) AS TEMP(c)
            
            CREATE XML SCHEMA COLLECTION MySchema AS @schema 

No próximo artigo, veremos os métodos do tipo xml que permitem consultar ou modificar dados xml. Também veremos a sintaxe e uso do XQuery, que possibilita a construção de consultas complexas sobre dados xml.