Comparar XML con tipo y XML sin tipo
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance
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 con formato 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 xmlsin 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 del lado 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 AdventureWorks .
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 solo 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 Crear instancias de datos 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 solo se almacenen en ella elementos únicos 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
Puede especificar las facetas DOCUMENT/CONTENT opcionales en cualquier lugar en que defina un tipo 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 tipos desde SQL Server 2005
SQL Server 2008 (10.0.x) realizó varias extensiones a la compatibilidad con esquema 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. Pero si en SQL Server 2005 (9.x) se usaba una colección de esquemas XML que permitía valores de tipo xs:date, xs:time o xs:dateTime (o cualquier subtipo), al conectar la base de datos SQL Server 2005 (9.x) a una versión posterior de SQL Server aparecerán los siguientes pasos de actualización:
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:
Se deshabilitarán todos los índices XML de la columna.
Todos los valores de SQL Server 2005 (9.x) se seguirán representando en la zona horaria Z, ya que se han normalizado a la zona horaria Z.
Cualquier valor xs:date o xs:dateTime que sea inferior al 1 de enero del año 1 provocará un error de ejecución cuando se reconstruya el índice o se ejecute una sentencia XQuery o XML-DML contra el tipo de datos xml que contiene ese valor.
Cualquier año negativo en las facetas o valores predeterminados 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 ejemplo, 0001-01-01T00:00:00.0000000Z para xs:dateTime).
Todavía puede usar una sentencia Transact-SQL SELECT para recuperar todo el tipo de datos xml, incluso si 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.