Compartir a través de


Comparación de XML con tipo y XML sin tipo

Se pueden crear variables, parámetros y columnas del tipo de datos xml. Opcionalmente, se puede asociar una colección de esquemas XML a una variable, a un parámetro o a una columna de tipo xml. En este caso, se dice que la instancia del tipo de datos xml es una instancia con tipo. En los demás casos, se dice que la instancia XML es una instancia sin tipo.

XML correcto y tipo de datos XML

El tipo de datos xml implementa el tipo de datos xml del estándar ISO. Por lo tanto, puede almacenar documentos XML versión 1.0 correctos, así como los denominados fragmentos de contenido XML con nodos de texto y un número arbitrario de elementos de nivel superior en una columna XML sin tipo. El sistema comprueba que todos los datos tienen un formato correcto, no requiere que la columna esté enlazada a esquemas XML y rechaza los datos que no tienen un formato correcto en sentido amplio. Esto también se cumple para parámetros y variables XML sin tipo.

Esquemas XML

Un esquema XML proporciona lo siguiente:

  • Restricciones de validación. Siempre que se asigna o modifica una instancia XML con tipo, SQL Server valida la instancia.

  • Información sobre el tipo de datos. Los esquemas proporcionan información sobre los tipos de atributos y elementos de la instancia de tipo de datos xml. La información de tipo proporciona una semántica operacional más precisa para los valores contenidos en la instancia que es posible con xml sin tipo. Por ejemplo, se pueden realizar operaciones aritméticas con decimales en un valor decimal, pero no en un valor de cadena. Por este motivo, el almacenamiento de XML con tipo puede ser mucho más compacto que el de XML sin tipo.

Elegir XML con tipo o sin tipo

El tipo de datos xml sin tipo se emplea en las siguientes situaciones:

  • No tiene un esquema para los datos XML.

  • Tiene esquemas pero no desea que el servidor valide los datos. Esto a veces ocurre cuando una aplicación realiza la validación en el cliente antes de almacenar los datos en el servidor, almacena temporalmente datos XML que no son válidos según el esquema, o usa componentes del esquema que no son compatibles con el servidor.

El tipo de datos xml con tipo se emplea en las siguientes situaciones:

  • Tiene esquemas para los datos XML y desea que el servidor valide estos datos según los esquemas XML.

  • Desea aprovechar las optimizaciones del almacenamiento y de las consultas en función de la información del tipo.

  • Desea aprovechar mejor la información del tipo durante la compilación de las consultas.

Columnas, parámetros y variables XML con tipo pueden almacenar documentos o contenido XML. No obstante, hay que especificar con una marca si se va a almacenar un documento o contenido en el momento de la declaración. Además, hay que proporcionar la colección de esquemas XML. Especifique DOCUMENT si cada instancia XML tiene exactamente un elemento de nivel superior. En caso contrario, use CONTENT. El compilador de consultas usa la marca DOCUMENT en comprobaciones de tipo durante la compilación de consultas para inferir elementos singleton de nivel superior.

Crear XML con tipo

Para poder crear variables, parámetros o columnas xml con tipo, primero es necesario registrar la colección de esquemas XML mediante CREATE XML SCHEMA COLLECTION (Transact-SQL). Después, se puede asociar la colección de esquemas XML a variables, parámetros o columnas del tipo de datos xml.

En los ejemplos siguientes se usa una convención de nomenclatura de dos partes para especificar el nombre de la recopilación de esquemas XML. La primera parte corresponde al nombre de esquema y la segunda al nombre de la colección de esquemas XML.

Ejemplo: Asociar una colección de esquemas con una variable de tipo XML

En el ejemplo siguiente se crea una variable de tipo xml y se le asocia una colección de esquemas. La colección de esquemas especificada en el ejemplo ya se ha importado a la base de datos AdventureWorks2008R2.

DECLARE @x xml (Production.ProductDescriptionSchemaCollection) 

Ejemplo: especificar un esquema para una columna de tipo XML

En el ejemplo siguiente se crea una tabla con una columna de tipo xml y se especifica un esquema para la columna:

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

Ejemplo: Pasar un parámetro de tipo XML a un procedimiento almacenado

En el ejemplo siguiente se pasa un parámetro de tipo xml a un procedimiento almacenado y se especifica un esquema para la variable:

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

Tenga en cuenta lo siguiente sobre la colección de esquemas XML:

  • Una colección de esquemas XML sólo está disponible en la base de datos en la que se ha registrado mediante CREATE XML SCHEMA COLLECTION.

  • Si se realiza la conversión de una cadena a un tipo de datos xml con tipo, el análisis también realiza la validación y la conversión de tipos, de acuerdo con los espacios de nombres de los esquemas XML de la colección especificada.

  • Es posible convertir un tipo de datos xml con tipo en un tipo de datos xml sin tipo, y viceversa.

Para obtener más información sobre otras maneras de generar XML en SQL Server, vea Generar instancias XML. Una vez generado el XML, se puede asignar a una variable del tipo de datos xml o se puede almacenar en columnas de tipo xml para su posterior procesamiento.

En la jerarquía de tipos de datos, el tipo de datos xml aparece por debajo de sql_variant y los tipos definidos por el usuario, pero por encima de los tipos integrados.

Ejemplo: Especificar facetas para restringir una columna XML con tipo

En las columnas xml con tipo se puede restringir la columna para permitir que sólo se almacene en ella un único elemento de nivel superior para cada instancia. Para ello, se especifica la faceta opcional DOCUMENT cuando se crea una tabla, como se muestra en el ejemplo siguiente:

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

De manera predeterminada, las instancias se almacenan en la columna xml con tipo como contenido XML y no como documentos XML. Esto permite lo siguiente:

  • Cero o varios elementos de nivel superior

  • Nodos de texto en elementos de nivel superior

Este comportamiento también se puede especificar explícitamente, agregando la faceta CONTENT, tal y como se muestra en el ejemplo siguiente:

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

Tenga en cuenta que puede especificar las facetas de DOCUMENT/CONTENT opcionales en cualquier lugar donde defina un tipo el xml (XML con tipo). Por ejemplo, cuando se crea una variable xml con tipo, se puede agregar la faceta DOCUMENT/CONTENT, como se muestra a continuación:

declare @x xml (DOCUMENT Production.ProductDescriptionSchemaCollection)

Definición de tipo de documento (DTD)

Las columnas de tipo de datos xml, las variables y los parámetros pueden obtener tipos utilizando un esquema XML, pero no mediante DTD. Sin embargo, se puede usar DTD insertado para XML con o sin tipo, para suministrar valores predeterminados y reemplazar referencias a entidades por su forma expandida.

Puede convertir las DTD en documentos de esquemas XML mediante herramientas de otros fabricantes y cargar los esquemas XML en la base de datos.

Actualizar XML con tipo de SQL Server 2005 a SQL Server 2008

SQL Server 2008 ha realizado varias extensiones a la compatibilidad con esquemas XML, incluyendo la compatibilidad para la validación lax, el control mejorado de xs:date, xs:time y datos de instancia xs:dateTime, y compatibilidad agregada para tipos de lista y tipos de unión. En la mayoría de los casos, los cambios no afectan a la experiencia de actualización. Sin embargo si usa una colección de esquemas XML en SQL Server 2005 que permitía valores del tipo xs:date, xs:time o xs:dateTime (o cualquier subtipo), los pasos de actualización siguientes se producen al asociar la base de datos de SQL Server 2005 a SQL Server 2008:

  1. Para cada columna XML, que se escribe con una Colección de esquemas XML que contiene elementos o atributos escritos como xs:anyType, xs:anySimpleType, xs:date o cualquiera de sus subtipos, xs:time o cualquier subtipo, o xs:dateTime o cualquiera de sus subtipos ,o son tipos de unión o de lista que contienen cualquiera de estos tipos, se produce lo siguiente:

    1. Se deshabilitarán todos los índices XML de la columna.

    2. Todos los valores de SQL Server 2005 continuarán representándose en la zona horaria Z porque se han normalizado a dicha zona horaria.

    3. Cualquier valor xs:date o xs:dateTime que sea menor que el 1 de enero del año 1 llevará a un error en tiempo de ejecución cuando el índice se regenere o se ejecute una XQuery o instrucciones XML-DML frente al tipo de datos XML que contiene dicho valor.

  2. Cualquier año negativo en las facetas o valores predeterminados de xs:date o xs:dateTime de una colección de esquemas XML se actualizará automáticamente al valor más pequeño permitido por el tipo base xs:date o xs:dateTime (por ejemplos, 0001-01-01T00:00:00.0000000Z para xs:dateTime).

Observe que todavía puede usar una instrucción SELECT de SQL para recuperar todo el tipo de datos XML, aun cuando contiene años negativos. Se recomienda que reemplace los años negativos por un año dentro del intervalo recientemente admitido o cambie el tipo del elemento o atributo a xs:string.