Comparar XML tipado com XML não tipado

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

É possível criar variáveis, parâmetros e colunas do tipo xml . Opcionalmente, é possível associar uma coleção de esquemas XML a 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. O sistema verifica se os dados estão bem formados, não exige que a coluna seja limitada a esquemas XML e rejeita dados que não estejam 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 xmlsem 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 tipado ou não tipado

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

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

  • Você tem esquemas, mas não quer que o servidor valide os dados. Algumas vezes, esse é o caso quando um aplicativo executa a 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 o 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 tipados, você deve registrar a coleção do esquema XML usando CREATE XML SCHEMA COLLECTION (Transact-SQL). Em seguida, você pode associar a coleção de esquema XML a 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 AdventureWorks .

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 Criar instâncias de dados 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 tipada

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

Você pode especificar as facetas opcionais DOCUMENT/CONTENT em qualquer lugar em que definir o tipo xml (xml tipado). 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 xml podem 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 a partir do SQL Server 2005

O SQL Server 2008 (10.0.x) fez várias extensões para o suporte ao esquema XML, incluindo suporte para validação frouxa, manipulação aprimorada de dados de instância xs:date, xs:time e xs:dateTime e suporte adicional para tipos de lista e união. Na maioria dos casos, as alterações não afetam a experiência de upgrade. No entanto, se você usou uma coleção de Esquemas XML no SQL Server 2005 (9.x) que permitia valores do tipo xs:date, xs:time ou xs:dateTime (ou qualquer subtipo), as seguintes etapas de atualização ocorrerão quando você anexar o banco de dados SQL Server 2005 (9.x) a uma versão posterior do SQL Server:

  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 (9.x) continuarão a ser representados no fuso horário Z, pois 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 de runtime 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 ou xs:dateTime (por exemplo, 0001-01-01T00:00:00.0000000Z para xs:dateTime).

Você ainda pode usar uma instrução Transact-SQL SELECT para recuperar todo o tipo de dados xml, mesmo que ele contenha anos negativos. Recomenda-se que você substitua os anos negativos por um ano dentro do novo intervalo suportado ou altere o tipo do elemento ou atributo para xs:string.

Confira também