Comparar XML digitado com XML não digitadoCompare Typed XML to Untyped XML

ESTE TÓPICO APLICA-SE A:simSQL Server (a partir de 2008)nãoBanco de Dados SQL do Microsoft AzurenãoAzure SQL Data Warehouse nãoParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

É possível criar variáveis, parâmetros e colunas do tipo xml .You can create variables, parameters, and columns of the xml type. Opcionalmente, é possível associar uma coleção de esquemas XML a uma variável, parâmetro ou coluna de tipo xml .You can optionally associate a collection of XML schemas with a variable, parameter, or column of xml type. Nesse caso, a instância do tipo de dados xml é chamada com tipo.In this case, the xml data type instance is called typed. Caso contrário, a instância XML é chamada sem-tipo.Otherwise, the XML instance is called untyped.

XML bem formado e o tipo de dados xmlWell-formed XML and the xml Data Type

O tipo de dados xml implementa o tipo de dados xml padrão ISO.The xml data type implements the ISO standard xml data type. 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.Therefore, it can store well-formed XML version 1.0 documents and also so-called XML content fragments with text nodes and an arbitrary number of top-level elements in an untyped XML column. 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.The system checks that the data is well-formed, does not require the column to be bound to XML schemas, and rejects data that is not well-formed in the extended sense. Isso também é verdadeiro para variáveis e parâmetros XML sem-tipo.This is true also of untyped XML variables and parameters.

Esquemas XMLXML Schemas

Um esquema XML fornece o seguinte:An XML schema provides the following:

  • Restrições de validação.Validation constraints. Sempre que uma instância xml com tipo é atribuída ou modificada, o SQL Server a valida.Whenever a typed xml instance is assigned to or modified, SQL Server validates the instance.

  • Informações sobre tipos de dados.Data type information. Os esquemas fornecem informações sobre os tipos de atributos e elementos na instância de tipo de dados xml .Schemas provide information about the types of attributes and elements in the xml data type instance. As informações de tipo fornecem semântica operacional mais precisa aos valores contidos na instância do que é possível com xmlsem tipo.The type information provides more precise operational semantics to the values contained in the instance than is possible with untyped xml. Por exemplo, podem ser executadas operações aritméticas decimais em um valor decimal, mas não em um valor de cadeia de caracteres.For example, decimal arithmetic operations can be performed on a decimal value, but not on a string value. Por causa disso, o armazenamento de XML com tipo pode ser feito de maneira significativamente mais compacta do que o XML sem-tipo.Because of this, typed XML storage can be made significantly more compact than untyped XML.

Escolhendo XML com tipo ou sem-tipoChoosing Typed or Untyped XML

Use o tipo de dados xml sem tipo nas seguintes situações:Use untyped xml data type in the following situations:

  • Você não tem um esquema para obter os dados XML.You do not have a schema for your XML data.

  • Você tem esquemas, mas não quer que o servidor valide os dados.You have schemas, but you do not want the server to validate the data. 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.This is sometimes the case when an application performs client-side validation before storing the data at the server, or temporarily stores XML data that is invalid according to the schema, or uses schema components that are not supported at the server.

    Use o tipo de dados xml com tipo nas seguintes situações:Use typed xml data type in the following situations:

  • Você tem esquemas para os dados XML e quer que o servidor valide os dados XML de acordo com os esquemas XML.You have schemas for your XML data and you want the server to validate your XML data according to the XML schemas.

  • Você quer usufruir de otimizações de consulta e de armazenamento com base em informações de tipo.You want to take advantage of storage and query optimizations based on type information.

  • Você quer usufruir melhor de informações de tipo durante a compilação de suas consultas.You want to take better advantage of type information during compilation of your queries.

    Colunas, parâmetros e variáveis de XML com tipo podem armazenar conteúdo ou documentos XML.Typed XML columns, parameters, and variables can store XML documents or content. No entanto é necessário especificar com um sinalizador se você está armazenando um documento ou conteúdo no momento da declaração.However, you have to specify with a flag whether you are storing a document or content at the time of declaration. Além disso, você precisa fornecer a coleção de esquemas XML.Additionally, you have to provide the collection of XML schemas. Especifique DOCUMENT se cada instância XML tiver exatamente um elemento de nível superior.Specify DOCUMENT if each XML instance has exactly one top-level element. Caso contrário, use CONTENT.Otherwise, 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.The query compiler uses the DOCUMENT flag in type checks during query compilation to infer singleton top-level elements.

Criando XML com tipoCreating Typed XML

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).Before you can create typed xml variables, parameters, or columns, you must first register the XML schema collection by using 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.You can then associate the XML schema collection with variables, parameters, or columns of the xml data type.

Nos exemplos a seguir, uma convenção de nomenclatura de duas partes é usada para especificar o nome da coleção de esquema XML.In the following examples, a two-part naming convention is used for specifying the XML schema collection name. A primeira parte é o nome do esquema e a segunda parte é o nome da coleção de esquema XML.The first part is the schema name, and the second part is the XML schema collection name.

Exemplo: Associando uma coleção de esquema com uma variável de tipo xmlExample: Associating a Schema Collection with an xml Type Variable

O exemplo a seguir cria uma variável de tipo xml e associa uma coleção de esquema a ela.The following example creates an xml type variable and associates a schema collection with it. A coleção de esquema especificada no exemplo já está importada no banco de dados AdventureWorks .The schema collection specified in the example is already imported in the AdventureWorks database.

DECLARE @x xml (Production.ProductDescriptionSchemaCollection);   

Exemplo: Especificando um esquema para uma coluna de tipo xmlExample: Specifying a Schema for an xml Type Column

O exemplo a seguir cria uma tabela com uma coluna de tipo xml e especifica um esquema para a coluna:The following example creates a table with an xml type column and specifies a schema for the column:

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

Exemplo: Passando um parâmetro de tipo xml para um procedimento armazenadoExample: Passing an xml Type Parameter to a Stored Procedure

O exemplo a seguir passa um parâmetro de tipo xml para um procedimento armazenado e especifica um esquema para a variável:The following example passes an xml type parameter to a stored procedure and specifies a schema for the variable:

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

Observe o seguinte sobre a coleção de esquema XML:Note the following about the XML schema collection:

  • 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.An XML schema collection is available only in the database in which it was registered by using Creating an XML Schema Collection.

  • 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.If you cast from a string to a typed xml data type, the parsing also performs validation and typing, based on the XML schema namespaces in the collection specified.

  • Você pode converter de um tipo de dados xml com tipo em um tipo de dados xml sem tipo e vice-versa.You can cast from a typed xml data type to an untyped xml data type, and vice versa.

    Para obter mais informações sobre outras maneiras de gerar XML no SQL Server, consulte Criar instâncias de dados XML.For more information about other ways to generate XML in SQL Server, see Create Instances of XML Data. 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.After XML is generated, it can be assigned either to an xml data type variable or stored in xml type columns for additional processing.

    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.In the data type hierarchy, the xml data type appears below sql_variant and user-defined types, but above any of the built-in types.

Exemplo: Especificando facetas para restringir uma coluna xml com tipoExample: Specifying Facets to Constrain a Typed xml Column

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.For typed xml columns, you can constrain the column to allow only single, top-level elements for each instance stored in it. Isso é feito especificando a faceta opcional DOCUMENT ao criar uma tabela, conforme mostrado no exemplo a seguir:You do this by specifying the optional DOCUMENT facet when a table is created, as shown in the following example:

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.By default, instances stored in the typed xml column are stored as XML content and not as XML documents. Isto permite o seguinte:This allows for the following:

  • Zero ou muitos elementos de nível superiorZero or many top-level elements

  • Nós de texto em elementos de nível superiorText nodes in top-level elements

    Você também pode especificar explicitamente esse comportamento adicionando a faceta CONTENT , conforme mostrado no exemplo a seguir:You can also explicitly specify this behavior by adding CONTENT facet, as shown in the following example:

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

Observe que você pode especificar as facetas opcionais DOCUMENT/CONTENT em qualquer lugar que definir o tipo xml (xml com tipo).Note that you can specify the optional DOCUMENT/CONTENT facets anywhere you define xml type (typed xml). Quando você cria uma variável xml com tipo, pode adicionar a faceta DOCUMENT/CONTENT, conforme mostrado no exemplo a seguir:For example, when you create a typed xml variable, you can add the DOCUMENT/CONTENT facet, as shown in the following:

declare @x xml (DOCUMENT Production.ProductDescriptionSchemaCollection);  

DTD (Definição de Tipo de Documento)Document Type Definition (DTD)

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.The xml data type columns, variables, and parameters can be typed by using XML schema, but not by using 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.However, inline DTD can be used for both untyped and typed XML to supply default values and to replace entity references with their expanded form.

É possível converter documentos de esquema DTD em XML usando ferramentas de terceiros e carregar os esquemas XML no banco de dados.You can convert DTDs to XML schema documents by using third-party tools, and load the XML schemas into the database.

Atualizando XML com tipo a partir do SQL Server 2005Upgrading Typed XML from SQL Server 2005

SQL Server 2008SQL Server 2008 fez várias extensões ao suporte do Esquema XML, incluindo suporte para validação incerta, manipulação melhorada de dados das instâncias xs:date, xs:time e xs:dateTime e suporte adicionado para tipos de lista e de união.made several extensions to the XML Schema support, including support for lax validation, improved handling of xs:date, xs:time and xs:dateTime instance data, and added support for list and union types. Na maior parte dos casos, as alterações não afetam a experiência de atualização.In most cases the changes do not affect the upgrade experience. No entanto, se você usou uma coleção de Esquemas XML no SQL Server 2005SQL Server 2005 que permitiu valores do tipo xs:date, xs:timeou xs:dateTime (ou qualquer subtipo), as seguintes etapas de atualização ocorrerão quando você anexar o banco de dados do SQL Server 2005SQL Server 2005 a uma versão posterior do SQL ServerSQL Server:However if you used an XML Schema collection in SQL Server 2005SQL Server 2005 that allowed values of type xs:date, xs:time, or xs:dateTime (or any subtype) then the following upgrade steps occur when you attach your SQL Server 2005SQL Server 2005 database to a later version of SQL ServerSQL 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:For every XML column, that is typed with an XML Schema Collection that contains elements or attributes that are typed as either xs:anyType, xs:anySimpleType, xs:date or any of its subtypes, xs:time or any subtype thereof, or xs:dateTime or any of its subtypes, or are union or list types containing any of these types the following occurs:

    1. Todos os índices XML da coluna serão desabilitados.All XML indices on the column will be disabled.

    2. Todos os valores do SQL Server 2005SQL Server 2005 continuarão a ser representados no fuso horário Z, pois foram normalizados para o fuso horário Z.All SQL Server 2005SQL Server 2005 values will continue to be represented in the Z timezone, because they have been normalized to the Z timezone.

    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.Any xs:date or xs:dateTime values that are smaller than January 1st of year 1 will lead to a runtime error when the index gets rebuild or an XQuery or XML-DML statements gets executed against the XML data type containing that value.

  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).Any negative years in xs:date or xs:dateTime facets or default values in an XML Schema collection will automatically be updated to the smallest value allowed by the base xs:date or xs:dateTime type (e.g., 0001-01-01T00:00:00.0000000Z for 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.Note that you can still use a simple SQL select statement to retrieve the whole XML data type, even if it contains negative years. É 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.It is recommended that you replace negative years with a year within the newly supported range or change the type of the element or attribute to xs:string.

Consulte TambémSee Also

Criar instâncias de dados XML Create Instances of XML Data
Métodos de tipos de dados xml xml Data Type Methods
Linguagem de modificação de dados XML (XML DML) XML Data Modification Language (XML DML)
Dados XML (SQL Server)XML Data (SQL Server)