Tipo de datos XML y columnas (SQL Server)XML Data Type and Columns (SQL Server)

SE APLICA A: síSQL Server (a partir de 2008) noAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

En este tema se explican las ventajas y las limitaciones del tipo de datos xml en SQL ServerSQL Servery le ayuda a elegir el modo de almacenar los datos XML.This topic discusses the advantages and the limitations of the xml data type in SQL ServerSQL Server, and helps you to choose how to store XML data.

Modelo de datos relacionales o XMLRelational or XML Data Model

Si los datos están muy estructurados con un esquema conocido, el modelo relacional tiene más probabilidades de funcionar mejor para el almacenamiento de datos.If your data is highly structured with known schema, the relational model is likely to work best for data storage. SQL ServerSQL Server proporciona la funcionalidad y las herramientas necesarias.provides the required functionality and tools you may need. Por otra parte, si los datos están semiestructurados o no están estructurados, o no se conoce su estructura, debe contemplar la posibilidad de crear un modelo para los datos.On the other hand, if the structure is semi-structured or unstructured, or unknown, you have to give consideration to modeling such data.

XML es una buena opción si desea un modelo independiente de la plataforma para garantizar la portabilidad de los datos mediante el uso de marcado estructural y semántico.XML is a good choice if you want a platform-independent model in order to ensure portability of the data by using structural and semantic markup. Además, es una opción apropiada si se cumplen algunas de las siguientes propiedades:Additionally, it is an appropriate option if some of the following properties are satisfied:

  • Los datos están dispersos o no se conoce la estructura de los mismos, o la estructura de los datos puede cambiar de manera importante en el futuro.Your data is sparse or you do not know the structure of the data, or the structure of your data may change significantly in the future.

  • Los datos representan una jerarquía de inclusión, en lugar de referencias entre entidades, y pueden ser recursivos.Your data represents containment hierarchy, instead of references among entities, and may be recursive.

  • El orden es inherente a los datos.Order is inherent in your data.

  • Desea realizar consultas en los datos o actualizar parte de ellos, basándose en su estructura.You want to query into the data or update parts of it, based on its structure.

Si no se cumple ninguna de estas condiciones, debe utilizar el modelo de datos relacional.If none of these conditions is met, you should use the relational data model. Por ejemplo, si los datos tienen formato XML pero la aplicación solo usa la base de datos para almacenar y recuperar los datos, solo necesitará una columna [n]varchar(max) .For example, if your data is in XML format but your application just uses the database to store and retrieve the data, an [n]varchar(max) column is all you require. Almacenar los datos en una columna XML tiene más ventajas.Storing the data in an XML column has additional benefits. Una de ellas es que se puede hacer que el motor determine si los datos tienen un formato correcto o son válidos, y otra es la posibilidad de realizar consultas y actualizaciones detalladas en los datos XML.This includes having the engine determine that the data is well formed or valid, and also includes support for fine-grained query and updates into the XML data.

Razones para almacenar datos XML en SQL ServerReasons for Storing XML Data in SQL Server

A continuación, se indican algunas de las razones para usar características XML nativas en SQL ServerSQL Server en lugar de administrar los datos XML en el sistema de archivos:Following are some of the reasons to use native XML features in SQL ServerSQL Server instead of managing your XML data in the file system:

  • Desea compartir los datos XML, hacer consultas en ellos y modificarlos de forma eficaz y con transacciones.You want to share, query, and modify your XML data in an efficient and transacted way. El acceso a datos con precisión es importante para la aplicación.Fine-grained data access is important to your application. Por ejemplo, tal vez desee extraer alguna sección de un documento XML, o insertar una nueva sección sin reemplazar todo el documento.For example, you may want to extract some of the sections within an XML document, or you may want to insert a new section without replacing your whole document.

  • Tiene datos relacionales y datos XML y desea que ambos tipos de datos puedan interoperar dentro de la aplicación.You have relational data and XML data and you want interoperability between both relational and XML data within your application.

  • Necesita compatibilidad con lenguajes para realizar consultas y modificar datos en aplicaciones situadas en diversos dominios.You need language support for query and data modification for cross-domain applications.

  • Desea que el servidor garantice que los datos tienen un formato correcto y además, opcionalmente, validar los datos de acuerdo con esquemas XML.You want the server to guarantee that the data is well formed and also optionally validate your data according to XML schemas.

  • Desea indizar los datos XML para obtener un procesamiento eficiente de las consultas y una buena escalabilidad, y el uso de un optimizador de consultas de primera clase.You want indexing of XML data for efficient query processing and good scalability, and the use of a first-rate query optimizer.

  • Desea el acceso de SOAP, ADO.NET y OLE DB a los datos XML.You want SOAP, ADO.NET, and OLE DB access to XML data.

  • Desea utilizar la funcionalidad administrativa del servidor de base de datos para administrar los datos XML,You want to use administrative functionality of the database server for managing your XML data. por ejemplo, para realizar copias de seguridad, recuperaciones y réplicas.For example, this would be backup, recovery, and replication.

Si no se cumple ninguna de estas condiciones, es posible que convenga almacenar los datos como tipo de objeto grande no XML, por ejemplo, [n]varchar(max) o varbinary(max) .If none of these conditions is satisfied, it may be better to store your data as a non-XML, large object type, such as [n]varchar(max) or varbinary(max).

Opciones de almacenamiento de XMLXML Storage Options

Las opciones de almacenamiento para XML en SQL ServerSQL Server son las siguientes:The storage options for XML in SQL ServerSQL Server include the following:

  • Almacenamiento nativo como tipo de datos xml .Native storage as xml data type

    Los datos se almacenan en una representación interna que conserva el contenido XML de los mismos.The data is stored in an internal representation that preserves the XML content of the data. Esta representación interna incluye información sobre la jerarquía de inclusión, el orden de los documentos y los valores de los elementos y los atributos.This internal representation includes information about the containment hierarchy, document order, and element and attribute values. En concreto, se conserva el contenido InfoSet de los datos XML.Specifically, the InfoSet content of the XML data is preserved. Para obtener más información sobre InfoSet, visite http://www.w3.org/TR/xml-infoset.For more information about InfoSet, visit http://www.w3.org/TR/xml-infoset. El contenido del InfoSet puede no ser una copia idéntica del texto XML, porque no se retiene la información siguiente: espacios en blanco no significativos, orden de los atributos, prefijos de los espacios de nombres y declaración XML.The InfoSet content may not be an identical copy of the text XML, because the following information is not retained: insignificant white spaces, order of attributes, namespace prefixes, and XML declaration.

    En el caso del tipo de datos xml con tipo, un tipo de datos xml enlazado a esquemas XML, el contenido InfoSet de validación de esquema posterior (PSVI) agrega información del tipo a InfoSet y se codifica en la representación interna.For typed xml data type, an xml data type bound to XML schemas, the post-schema validation InfoSet (PSVI) adds type information to the InfoSet and is encoded in the internal representation. De este modo, se mejora considerablemente la velocidad de análisis.This improves parsing speed significantly. Para obtener más información, vea las especificaciones del esquema XML de W3C en http://www.w3.org/TR/xmlschema-1 y http://www.w3.org/TR/xmlschema-2.For more information, see the W3C XML Schema specifications at http://www.w3.org/TR/xmlschema-1 and http://www.w3.org/TR/xmlschema-2.

  • Asignar entre almacenamiento XML y relacionalMapping between XML and relational storage

    El esquema anotado (AXSD) permite descomponer el código XML en columnas en una o más tablas.By using an annotated schema (AXSD), the XML is decomposed into columns in one or more tables. Así, se preserva la fidelidad de los datos en el nivel relacional.This preserves fidelity of the data at the relational level. Como resultado, la estructura jerárquica se mantiene aunque se omita el orden entre los elementos.As a result, the hierarchical structure is preserved although order among elements is ignored. El esquema no puede ser recursivo.The schema cannot be recursive.

  • Almacenamiento de objetos grandes, [n]varchar(max) y varbinary(max)Large object storage, [n]varchar(max) and varbinary(max)

    Se almacena una copia idéntica de los datos.An identical copy of the data is stored. Esto resulta útil en el caso de aplicaciones para fines específicos, como documentos legales.This is useful for special-purpose applications such as legal documents. La mayoría de las aplicaciones no requieren una copia exacta y les basta con el contenido XML (fidelidad InfoSet).Most applications do not require an exact copy and are satisfied with the XML content (InfoSet fidelity).

En general, es posible que se tenga que usar una combinación de estos enfoques.Generally, you may have to use a combination of these approaches. Por ejemplo, tal vez desee almacenar los datos XML en una columna de tipo de datos xml y promover las propiedades correspondientes en columnas relacionales.For example, you may want to store your XML data in an xml data type column and promote properties from it into relational columns. O tal vez quiera usar tecnología de asignaciones para almacenar partes no recursivas en columnas no XML y solo las partes recursivas en columnas de tipo de datos xml .Or, you may want to use mapping technology to store nonrecursive parts in non-XML columns and only the recursive parts in xml data type columns.

Elección de la tecnología XMLChoice of XML Technology

La elección de la tecnología XML, XML nativo frente a vista XML, en general depende de los siguientes factores:The choice of XML technology, native XML versus XML view, generally depends upon the following factors:

  • Opciones de almacenamientoStorage options

    Los datos XML pueden ser más apropiados para el almacenamiento de objetos grandes (por ejemplo, el manual de un producto) o más sensibles al almacenamiento en columnas relacionales (por ejemplo, un elemento de línea convertido a XML).Your XML data may be more appropriate for large object storage (for example, a product manual), or more amenable to storage in relational columns (for example, a line item converted to XML). Cada opción de almacenamiento preserva la fidelidad del documento en distinta medida.Each storage option preserves document fidelity to a different extent.

  • Funciones de consultasQuery capabilities

    Es posible que una opción de almacenamiento le parezca más apropiada que otra en función de la naturaleza de las consultas y del nivel de detalle con que desea consultar los datos XML.You may find one storage option more appropriate than another, based on the nature of your queries and on the extent to which you query your XML data. La consulta detallada de los datos XML (por ejemplo, evaluación de predicados en nodos XML) se admite en diversos grados en las dos opciones de almacenamiento.Fine-grained query of your XML data, for example, predicate evaluation on XML nodes, is supported to varying degrees in the two storage options.

  • Indizar datos XMLIndexing XML data

    Tal vez desee indizar los datos XML para acelerar el rendimiento de las consultas XML.You may want to index the XML data to speed up XML query performance. Las opciones de indización varían según las opciones de almacenamiento; es necesario hacer la elección apropiada para optimizar la carga de trabajo.Indexing options vary with the storage options; you have to make the appropriate choice to optimize your workload.

  • Funciones para la modificación de datosData modification capabilities

    Algunas cargas de trabajo implican una modificación detallada de los datos XML.Some workloads involve fine-grained modification of XML data. Éste es el caso de agregar una sección nueva a un documento. Sin embargo, otras cargas de trabajo, como el contenido web, no implican la modificación detallada de los datos XML.For example, this can include adding a new section within a document, while other workloads, such as Web content, do not. La compatibilidad con el lenguaje de modificación de datos puede ser importante para la aplicación.Data modification language support may be important for your application.

  • Compatibilidad con esquemasSchema support

    Los datos XML se pueden describir mediante un esquema que puede ser o no un documento de esquema XML.Your XML data may be described by a schema that may or may not be an XML schema document. La compatibilidad con XML enlazado a un esquema depende de la tecnología XML.The support for schema-bound XML depends upon the XML technology.

Las diferentes opciones también tienen distintas características en cuanto al rendimiento.Different choices also have different performance characteristics.

Almacenamiento de XML nativoNative XML Storage

Los datos XML se pueden almacenar en una columna de tipo de datos xml en el servidor.You can store your XML data in an xml data type column at the server. Esta es una elección apropiada si se cumple lo siguiente:This is an appropriate choice if the following applies:

  • Desea una manera directa de almacenar los datos XML en el servidor y, al mismo tiempo, preservar el orden y la estructura de los documentos.You want a straightforward way to store your XML data at the server and, at the same time, preserve document order and document structure.

  • Puede tener o no un esquema para los datos XML.You may or may not have a schema for your XML data.

  • Desea consultar y modificar los datos XML.You want to query and modify your XML data.

  • Desea indizar los datos XML para procesar más rápido las consultas.You want to index the XML data for faster query processing.

  • La aplicación necesita vistas de catálogo del sistema para administrar los datos XML y los esquemas XML.Your application needs system catalog views to administer your XML data and XML schemas.

El almacenamiento XML nativo es útil cuando se tienen documentos XML con una serie de estructuras, o si se tienen documentos XML que se ajustan a esquemas diferentes o completos que son demasiado difíciles de asignar a estructuras relacionales.Native XML storage is useful when you have XML documents that have a range of structures, or you have XML documents that conform to different or complex schemas that are too hard to map to relational structures.

Ejemplo: modelado de datos XML mediante el tipo de datos xmlExample: Modeling XML Data Using the xml Data Type

Piense en el manual de un producto en formato XML compuesto por un capítulo independiente para cada tema y por varias secciones dentro de cada capítulo.Consider a product manual in XML format that is made up of a separate chapter for each topic and that has multiple sections within each chapter. Una sección puede contener subsecciones.A section can contain subsections. Como resultado, <section> es un elemento recursivo.As a result, <section> is a recursive element. Los manuales de productos contienen una gran cantidad de contenido, diagramas y material técnico entremezclado; los datos están semiestructurados.Product manuals contain a large amount of mixed content, diagrams, and technical material; the data is semi-structured. Es posible que los usuarios deseen efectuar búsquedas contextuales de temas de interés, como la sección sobre "índices clúster" en el capítulo sobre "indización", y consultar dimensiones técnicas.Users may want to perform a contextual search for topics of interest such as searching for the section on "clustered index" within the chapter on "indexing", and query technical quantities.

Un modelo de almacenamiento apropiado para los documentos XML es una columna de tipo de datos xml .An appropriate storage model for your XML documents is an xml data type column. Así se preserva el contenido InfoSet de los datos XML.This preserves the InfoSet content of your XML data. La indización de la columna XML favorece el rendimiento de las consultas.Indexing the XML column benefits query performance.

Ejemplo: conservación de copias exactas de los datos XMLExample: Retaining Exact Copies of XML Data

A modo de ilustración, suponga que las normativas del gobierno le exigen que retenga copias textuales exactas de sus documentos XML,For illustration, assume that government regulations require you to retain exact textual copies of your XML documents. como documentos firmados, documentos legales o pedidos de transacciones de almacén.For example, these could include signed documents, legal documents, or stock transaction orders. Tal vez quiera almacenar los documentos en una columna [n]varchar(max) .You may want to store your documents in a [n]varchar(max) column.

Para realizar consultas, convierta los datos al tipo de datos xml en tiempo de ejecución y ejecute Xquery.For querying, convert the data to xml data type at run time and execute Xquery on it. La conversión en tiempo de ejecución puede ser larga, especialmente si el documento es grande.The run-time conversion may be costly, especially when the document is large. Si realiza consultas con frecuencia, puede almacenar repetidamente los documentos en una columna de tipo de datos xml e indexarla mientras devuelve copias exactas de los documentos desde la columna [n]varchar(max) .If you query frequently, you can redundantly store the documents in an xml data type column and index it while you return exact document copies from the [n]varchar(max) column.

La columna XML puede ser una columna calculada basada en la columna [n]varchar(max) .The XML column may be a computed column, based on the [n]varchar(max) column. Pero no se puede crear un índice XML en una columna XML calculada, ni se puede generar un índice XML en columnas [n]varchar(max) o varbinary(max) .However, you cannot create an XML index on a computed, XML column, nor can an XML index be built on [n]varchar(max) or varbinary(max) columns.

Tecnología de vistas XMLXML View Technology

La definición de una asignación entre los esquemas XML y las tablas de una base de datos permite crear una "vista XML" de los datos permanentes.By defining a mapping between your XML schemas and the tables in a database, you create an "XML view" of your persistent data. Se puede efectuar una carga masiva de XML para rellenar las tablas subyacentes mediante la vista XML.XML bulk load can be used to populate the underlying tables by using the XML view. Puede efectuar una consulta en la vista XML mediante XPath versión 1.0; la consulta se traduce en consultas SQL en las tablas.You can query the XML view by using XPath version 1.0; the query is translated to SQL queries on the tables. Del mismo modo, las actualizaciones también se propagan a dichas tablas.Similarly, updates are also propagated to those tables.

Esta tecnología es útil en las situaciones siguientes:This technology is useful in the following situations:

  • Desea tener un modelo de programación centrado en XML utilizando vistas XML sobre los datos relacionales existentes.You want to have an XML-centric programming model using XML views over your existing relational data.

  • Tiene un esquema (XSD, XDR) para los datos XML que puede haberle proporcionado un asociado externo.You have a schema (XSD, XDR) for your XML data that an external partner may have provided.

  • El orden no es importante para los datos, los datos de la tabla de la consulta no son recursivos, o el grado máximo de recursividad se conoce de antemano.Order is not important in your data, or your query table data is not recursive, or the maximal recursion depth is known in advance.

  • Desea consultar y modificar los datos a través de la vista XML mediante XPath versión 1.0.You want to query and modify the data through the XML view by using XPath version 1.0.

  • Desea efectuar una carga masiva de datos XML y distribuirlos en las tablas subyacentes mediante la vista XML.You want to bulk load XML data and decompose them into the underlying tables by using the XML view.

Algunos ejemplos son datos relacionales expuestos como XML para el intercambio de datos y servicios web, y datos XML con esquema fijo.Examples include relational data exposed as XML for data exchange and Web services, and XML data with fixed schema. Para obtener más información, vea la biblioteca en línea MSDN Library.For more information, see the MSDN Online Library.

Ejemplo: modelado de datos con un esquema XML anotado (AXSD)Example: Modeling Data Using an Annotated XML Schema (AXSD)

A modo de ilustración, suponga que tiene datos relacionales como clientes, pedidos y artículos de línea, que desea tratar como XML.For illustration, assume that you have existing relational data, such as customers, orders, and line items, that you want to handle as XML. Defina una vista XML utilizando AXSD sobre los datos relacionales.Define an XML view by using AXSD over the relational data. La vista XML permite efectuar una carga masiva de datos XML en las tablas así como consultar y actualizar los datos relacionales utilizando dicha vista.The XML view allows you to bulk load XML data into your tables and query and update the relational data by using the XML view. Este modelo es útil si hay que intercambiar datos que contienen marcado XML con otras aplicaciones, mientras las aplicaciones SQL se ejecutan ininterrumpidamente.This model is useful if you have to exchange data that contains XML markup with other applications while your SQL applications work uninterrupted.

Modelo híbridoHybrid Model

Con frecuencia, para crear modelos de datos, resulta apropiada una combinación de columnas de tipo de datos relacionales y xml .Frequently, a combination of relational and xml data type columns is appropriate for data modeling. Algunos valores de los datos XML se pueden almacenar en columnas relacionales y, el resto, o el conjunto de valores XML, en una columna XML.Some of the values from your XML data can be stored in relational columns, and the rest, or the whole XML value stored in an XML column. De este modo, se puede obtener un mejor rendimiento ya que se tiene más control sobre los índices creados en las columnas relacionales y las características de bloqueo.This may yield better performance in that you have more control over the indexes created on the relational columns and locking characteristics.

Los valores para almacenar en columnas relacionales dependen de la carga de trabajo.The values to store in relational columns depend on your workload. Por ejemplo, si se recuperan todos los valores XML basados en la expresión de ruta de acceso, /Customer/@CustId, promoviendo el valor del atributo CustId a una columna relacional e indexándolo, se puede lograr un mejor rendimiento en las consultas.For example, if you retrieve all the XML values based on the path expression, /Customer/@CustId, promoting the value of the CustId attribute into a relational column and indexing it may yield faster query performance. Por otra parte, si los datos XML se distribuyen ampliamente y sin redundancias en columnas relacionales, el costo del reensamblado puede ser importante.On the other hand, if your XML data is extensively and nonredundantly decomposed into relational columns, the re-assembly cost may be significant.

En el caso de datos XML muy estructurados, por ejemplo, el contenido de una tabla se ha convertido en XML; se pueden asignar todos los valores a columnas relacionales y, posiblemente, usar la tecnología de vistas XML.For highly structured XML data, for example, the content of a table has been converted into XML; you can map all values to relational columns, and possibly use XML view technology.

Granularidad de los datos XMLGranularity of XML Data

La granularidad de los datos XML almacenados en una columna XML es muy importante para los bloqueos y, en menor medida, para las actualizaciones.The granularity of the XML data stored in an XML column is very important for locking and, to a lesser degree, it is also important for updates. SQL ServerSQL Server usa el mismo mecanismo de bloqueo tanto para datos XML como no XML.uses the same locking mechanism for both XML and non-XML data. Por lo tanto, un bloqueo de nivel de fila provoca que todas las instancias XML de la fila queden bloqueadas.Therefore, row-level locking causes all XML instances in the row to be locked. Cuando la granularidad es grande, el bloqueo de instancias XML grandes provoca una disminución del rendimiento en un escenario multiusuario.When the granularity is large, locking large XML instances for updates causes throughput to decline in a multiuser scenario. Por otra parte, una distribución amplia provoca una pérdida de la encapsulación de objetos e incrementa el costo del reensamblado.On the other hand, severe decomposition loses object encapsulation and increases reassembly cost.

Para lograr un buen diseño, es importante alcanzar un equilibrio entre los requisitos necesarios para crear modelos de datos y las características de bloqueo y actualización.A balance between data modeling requirements and locking and update characteristics is important for good design. Sin embargo, en SQL ServerSQL Server, el tamaño de las instancias XML almacenadas realmente no es tan importante.However, in SQL ServerSQL Server, the size of actual stored XML instances is not as critical.

Por ejemplo, las actualizaciones de una instancia XML se efectúan utilizando el nuevo soporte para actualizaciones parciales de objetos binarios grandes (BLOB) y de índices en las que la instancia XML almacenada existente se compara con su versión actualizada.For example, updates to an XML instance are performed by using new support for partial binary large object (BLOB) and partial index updates in which the existing stored XML instance is compared to its updated version. La actualización parcial de objetos binarios grandes (BLOB) realiza una comparación diferencial entre las dos instancias XML y únicamente actualiza las diferencias.Partial binary large object (BLOB) update performs a differential comparison between the two XML instances and updates only the differences. Las actualizaciones parciales de índices solo modifican aquellas filas que se deben cambiar en el índice XML.Partial index updates modify only those rows that must be changed in the XML index.

Limitaciones del tipo de datos xmlLimitations of the xml Data Type

Tenga en cuenta que el tipo de datos xml tiene las limitaciones siguientes:Note the following general limitations that apply to the xml data type:

  • La representación almacenada de las instancias del tipo de datos xml no puede superar los 2 GB.The stored representation of xml data type instances cannot exceed 2 GB.

  • No puede usarse como un subtipo de una instancia de sql_variant .It cannot be used as a subtype of a sql_variant instance.

  • No admite la conversión a text ni a ntext.It does not support casting or converting to either text or ntext. Use en su lugar varchar(max) o nvarchar(max) .Use varchar(max) or nvarchar(max) instead.

  • No puede compararse ni ordenarse.It cannot be compared or sorted. Esto significa que un tipo de datos xml no puede utilizarse en una instrucción GROUP BY.This means an xml data type cannot be used in a GROUP BY statement.

  • No puede utilizarse como parámetro de ninguna función integrada escalar que no sea ISNULL, COALESCE o DATALENGTH.It cannot be used as a parameter to any scalar, built-in functions other than ISNULL, COALESCE, and DATALENGTH.

  • No puede utilizarse como columna de clave de un índice.It cannot be used as a key column in an index. Sin embargo, puede incluirse en forma de datos en un índice clúster o puede agregarse explícitamente a un índice no clúster mediante el uso de la palabra clave INCLUDE al crear el índice no clúster.However, it can be included as data in a clustered index or explicitly added to a nonclustered index by using the INCLUDE keyword when the nonclustered index is created.

  • Los elementos XML se pueden anidar hasta 128 niveles.XML elements can be nested up to 128 levels.

Consulte tambiénSee Also

Ejemplos de importación y exportación en bloque de documentos XML (SQL Server)Examples of Bulk Import and Export of XML Documents (SQL Server)