Compartilhar via


XML digitado comparado com XML não digitado

É possível criar variáveis, parâmetros e colunas do tipo xml. Opcionalmente, é possível associar uma coleção de esquemas XML com uma variável, parâmetro ou coluna de tipo xml. Nesse caso, a instância do tipo de dados xml é chamada com tipo. Caso contrário, a instância XML é chamada sem-tipo.

XML bem formado e o tipo de dados xml

O tipo de dados xml implementa o tipo de dados xml padrão ISO. Portanto ele pode armazenar documentos bem formados em XML versão 1.0 e também os chamados fragmentos de conteúdo XML com nós de texto e um número arbitrário de elementos de nível superior em uma coluna XML sem-tipo. Os sistema verifica se os dados estão bem formados, se não requerem que a coluna esteja associada a esquemas XML e rejeita dados que não são bem formados no sentido estendido. Isso também é verdadeiro para variáveis e parâmetros XML sem-tipo.

Esquemas XML

Um esquema XML fornece o seguinte:

  • Restrições de validação. Sempre que uma instância xml com tipo é atribuída ou modificada, o SQL Server a valida.

  • Informações sobre tipos de dados. Os esquemas fornecem informações sobre os tipos de atributos e elementos na instância de tipo de dados xml. As informações de tipo fornecem semântica operacional mais precisa aos valores contidos na instância do que é possível com xml sem-tipo. Por exemplo, podem ser executadas operações aritméticas decimais em um valor decimal, mas não em um valor de cadeia de caracteres. Por causa disso, o armazenamento de XML com tipo pode ser feito de maneira significativamente mais compacta do que o XML sem-tipo.

Escolhendo XML com tipo ou sem-tipo

Use tipo de dados xml sem-tipo nas seguintes situações:

  • Você não tem um esquema para obter os dados XML.

  • Você tem esquemas, mas não quer que o servidor valide os dados. Algumas vezes, esse é o caso quando um aplicativo executa validação do lado do cliente antes de armazenar os dados no servidor ou armazena temporariamente os dados XML que são inválidos de acordo com o esquema ou usa componentes de esquema que não têm suporte no servidor.

Use tipo de dados xml com tipo nas seguintes situações:

  • Você tem esquemas para os dados XML e quer que o servidor valide os dados XML de acordo com os esquemas XML.

  • Você quer usufruir de otimizações de consulta e de armazenamento com base em informações de tipo.

  • Você quer usufruir melhor de informações de tipo durante a compilação de suas consultas.

Colunas, parâmetros e variáveis de XML com tipo podem armazenar conteúdo ou documentos XML. No entanto é necessário especificar com um sinalizador se você está armazenando um documento ou conteúdo no momento da declaração. Além disso, você precisa fornecer a coleção de esquemas XML. Especifique DOCUMENT se cada instância XML tiver exatamente um elemento de nível superior. Caso contrário, use CONTENT. O compilador de consultas usa o sinalizador DOCUMENT em verificações de tipo durante a compilação de consultas para deduzir elementos singleton de nível superior.

Criando XML com tipo

Antes de criar variáveis, parâmetros ou colunas xml com tipo, você deve primeiro registrar a coleção de esquema XML usando CREATE XML SCHEMA COLLECTION (Transact-SQL). Em seguida, você pode associar a coleção de esquema XML com variáveis, parâmetros ou colunas do tipo de dados xml.

Nos exemplos a seguir, uma convenção de nomenclatura de duas partes é usada para especificar o nome da coleção de esquema XML. A primeira parte é o nome do esquema e a segunda parte é o nome da coleção de esquema XML.

Exemplo: Associando uma coleção de esquema com uma variável de tipo xml

O exemplo a seguir cria uma variável de tipo xml e associa uma coleção de esquema a ela. A coleção de esquema especificada no exemplo já está importada no banco de dados AdventureWorks2008R2.

DECLARE @x xml (Production.ProductDescriptionSchemaCollection) 

Exemplo: Especificando um esquema para uma coluna de tipo xml

O exemplo a seguir cria uma tabela com uma coluna de tipo xml e especifica um esquema para a coluna:

CREATE TABLE T1(
 Col1 int, 
 Col2 xml (Production.ProductDescriptionSchemaCollection)) 

Exemplo: Passando um parâmetro de tipo xml para um procedimento armazenado

O exemplo a seguir passa um parâmetro de tipo xml para um procedimento armazenado e especifica um esquema para a variável:

CREATE PROCEDURE SampleProc 
  @ProdDescription xml (Production.ProductDescriptionSchemaCollection) 
AS 

Observe o seguinte sobre a coleção de esquema XML:

  • Uma coleção de esquema XML está disponível apenas no banco de dados no qual ela foi registrada usando Criando uma coleção de esquema XML.

  • Se você converter de um tipo de dados de cadeia de caracteres em xml com tipo, a análise também executará validação e classificação de tipo com base nos namespaces do esquema XML na coleção especificada.

  • Você pode converter de um tipo de dados xml com tipo em um tipo de dados xml sem-tipo e vice-versa.

Para obter mais informações sobre outras maneiras de gerar XML no SQL Server, consulte Gerando instâncias XML. Depois que o XML é gerado, ele pode ser atribuído a uma variável de tipo de dados xml ou armazenado em colunas de tipo xml para processamento adicional.

Na hierarquia de tipo de dados, o tipo de dados xml aparece abaixo dos tipos de dados sql_variant e definidos pelo usuário, mas acima de qualquer tipo interno.

Exemplo: Especificando facetas para restringir uma coluna xml com tipo

Para colunas xml com tipo, é possível restringir a coluna para permitir que apenas elementos únicos de nível superior de cada instância sejam armazenados nela. Isso é feito especificando a faceta opcional DOCUMENT ao criar uma tabela, conforme mostrado no exemplo a seguir:

CREATE TABLE T(Col1 xml 
   (DOCUMENT Production.ProductDescriptionSchemaCollection))
GO
DROP TABLE T
GO

Por padrão, instâncias armazenadas na coluna xml com tipo são armazenadas como conteúdo XML e não como documentos XML. Isto permite o seguinte:

  • Zero ou muitos elementos de nível superior

  • Nós de texto em elementos de nível superior

Você também pode especificar explicitamente esse comportamento adicionando a faceta CONTENT, conforme mostrado no exemplo a seguir:

CREATE TABLE T(Col1 xml(CONTENT Production.ProductDescriptionSchemaCollection))
GO -- Default

Observe que você pode especificar as facetas opcionais DOCUMENT/CONTENT em qualquer lugar em que define tipo xml (xml com tipo). Quando você cria uma variável xml com tipo, pode adicionar a faceta DOCUMENT/CONTENT, conforme mostrado no exemplo a seguir:

declare @x xml (DOCUMENT Production.ProductDescriptionSchemaCollection)

DTD (Definição de Tipo de Documento)

As colunas, variáveis e parâmetros de tipo de dados xmlpodem ter o tipo definido usando esquema XML, mas não usando DTD. No entanto DTD embutido pode ser usado para XML com tipo e sem-tipo para fornecer valores padrão e para substituir referências a entidades com seus formulários expandidos.

É possível converter documentos de esquema DTD em XML usando ferramentas de terceiros e carregar os esquemas XML no banco de dados.

Atualizando XML com tipo do SQL Server 2005 para o SQL Server 2008

O SQL Server 2008 fez várias extensões ao suporte a Esquema XML, incluindo suporte para validação incerta, manipulação melhorada de dados de instâncias xs:date, xs:time e xs:dateTime e suporte para tipos de lista e de união. Na maior parte dos casos, as alterações não afetam a experiência de atualização. No entanto se você usar uma coleção de esquema XML no SQL Server 2005 que permitia valores de tipo xs:date, xs:time ou xs:dateTime (ou qualquer subtipo) as seguintes etapas de atualização ocorrerão quando você conectar o banco de dados do SQL Server 2005 ao SQL Server 2008:

  1. Para cada coluna XML que recebe tipo com uma Coleção de Esquema XML que contém elementos ou atributos que recebem o tipo de xs:anyType, xs:anySimpleType, xs:date ou qualquer um de seus subtipos, xs:time ou qualquer um de seus subtipos, ou xs:dateTime ou qualquer um de seus subtipos, ou são de tipo de união ou de lista contendo qualquer um desses tipos, ocorre o seguinte:

    1. Todos os índices XML da coluna serão desabilitados.

    2. Todos os valores do SQL Server 2005 continuarão a ser representados no fuso horário Z por que foram normalizados para o fuso horário Z.

    3. Quaisquer valores de xs:date ou xs:dateTime menores que 1º de janeiro do ano 1 resultarão em um erro em tempo de execução quando o índice for reconstruído ou uma instrução Xquery ou XML-DML for executada em relação ao tipo de dados XML que contém esse valor.

  2. Quaisquer anos negativos nas facetas xs:date ou xs:dateTime ou valores padrão em uma coleção de esquema XML serão atualizados automaticamente para o menor valor permitido pelo tipo xs:date ouxs:dateTime base (por exemplo, 0001-01-01T00:00:00.0000000Z para xs:dateTime).

Observe que você ainda pode usar uma instrução select SQL simples para recuperar o tipo de dados XML inteiro, mesmo que ele contenha anos negativos. É recomendável substituir anos negativos por um ano dentro do intervalo com suporte recente ou alterar o tipo do elemento ou atributo para xs:string.