Compartir vía


Crear instancias de datos XML

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance

En este artículo se describe cómo generar las instancias XML.

En SQL Server, podrá generar instancias XML de las formas siguientes:

  • Instancias de cadenas de conversión de tipo.
  • Uso de la instrucción SELECT con la cláusula FOR XML.
  • Usar asignaciones de constantes.
  • Usar la carga masiva.

Instancias de cadena de caracteres y binarias

Se pueden analizar cualquiera de los tipos de datos de cadena de SQL Server, como [n]varchar, [n]char, [n]text, varbinary e image, en el tipo de datos xml mediante el casting (CAST) o la conversión (CONVERT) de la cadena al tipo de datos xml. Se comprueba el XML sin tipo para confirmar que su formato es correcto. Si hay un esquema asociado al tipo xml , también se realiza una validación. Para obtener más información, consulta Comparar XML con tipo y XML sin tipo.

Los documentos XML pueden codificarse con distintas codificaciones (por ejemplo, UTF-8, UTF-16, Windows-1252). A continuación se describen de forma resumida las reglas que establecen el modo en que los tipos de origen de cadena y binarios interactúan con la codificación del documento XML y cómo se comporta el analizador.

Puesto que nvarchar asume una codificación Unicode de 2 bytes como UTF-16 o UCS-2, el analizador de XML tratará el valor de cadena como un documento o fragmento XML codificado con Unicode de 2 bytes. El documento XML también debe codificarse con codificación Unicode de 2 bytes para que sea compatible con el tipo de datos de origen. Un documento XML con codificación UTF-16 puede tener una marca de orden de bytes (BOM) UTF-16, pero no es necesario que la tenga ya que el contexto del tipo de origen indica claramente que solo puede tratarse de un documento con codificación Unicode de 2 bytes.

El analizador de XML trata el contenido de una cadena varchar como un documento o fragmento XML con codificación de un 1 byte. Dado que la cadena de origen varchar tiene asociada una página de códigos, el analizador usa esa página de códigos para la codificación si no se especifica ninguna codificación explícita en el propio XML. Si una instancia XML tiene una lista de materiales o una declaración de codificación, la lista de materiales o la declaración debe ser coherente con la página de códigos; de lo contrario, el analizador notifica un error.

El contenido de varbinary se trata como un flujo de puntos de código que se pasa directamente al analizador de XML. Por consiguiente, el documento o fragmento XML debe proporcionar la marca BOM u otro tipo de información de codificación insertada. Para determinar la codificación, el analizador solo consulta el flujo. Esto significa que el XML con codificación UTF-16 debe proporcionar la marca BOM UTF-16 y que una instancia sin marca BOM y sin una codificación de declaración se interpreta como UTF-8.

Si la codificación del documento XML no se conoce de antemano y los datos se pasan como datos de cadena o datos binarios en lugar de pasarse como datos XML antes de realizar su conversión a XML, debes tratar los datos como varbinary. Por ejemplo, si se leen datos de un archivo XML usando OpenRowset(), es necesario especificar los datos que deben leerse como un valor varbinary(max):

SELECT CAST(x AS XML)
FROM OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x);

SQL Server representa internamente XML en una representación binaria eficaz que usa la codificación UTF-16. La codificación proporcionada por el usuario no se mantiene, pero se tiene en cuenta durante el proceso de análisis.

Conversión de tipos definidos por el usuario CLR

Si un tipo definido por el usuario CLR tiene una serialización XML, las instancias de dicho tipo pueden convertirse explícitamente a un tipo de datos XML. Para obtener más información sobre la serialización XML de un tipo de datos definido por el usuario CLR, vea Serialización XML de objetos de base de datos de CLR.

Control de los espacios en blanco en XML

En SQL Server, el espacio en blanco dentro del contenido de un elemento se omite si se produce dentro de una secuencia de datos de caracteres de solo espacio en blanco delimitada por marcas, como etiquetas de inicio o fin, y no está titulada. (Las secciones CDATA se omiten.) Este control de los espacios en blanco es distinto de lo que se describe en la especificación XML 1.0 publicada por el World Wide Web Consortium (W3C). Esto se debe a que el analizador XML de SQL Server solo reconoce un número limitado de subconjuntos DTD, tal y como se definen en XML 1.0. Para obtener más información sobre los subconjuntos limitados de DTD admitidos en SQL Server, consulta CAST y CONVERT.

De forma predeterminada, el analizador de XML descarta los espacios en blanco insignificantes cuando convierte datos de cadena a XML si son válidas algunas de las opciones siguientes:

  • El atributo xml:space no está definido en un elemento o sus elementos antecesores.

  • El atributo xml:space activo en un elemento, o uno de sus elementos antecesores, tiene el valor predeterminado.

Por ejemplo:

DECLARE @x XML;
SET @x = '<root>      <child/>     </root>';
SELECT @x;

El conjunto de resultados es el siguiente:

<root><child/></root>

Sin embargo, puedes cambiar este comportamiento. Para mantener los espacios en blanco de una instancia DT xml, utiliza el operador CONVERT y su parámetro style opcional establecido en el valor 1. Por ejemplo:

SELECT CONVERT(XML, N'<root>      <child/>     </root>', 1);

Si no se utiliza el parámetro style o su valor es 0, no se mantendrán los espacios en blanco insignificantes para la conversión de la instancia DT xml. Para obtener más información sobre cómo usar el operador CONVERT y su parámetro style al convertir datos de cadena a instancias de DT xml, consulta CAST y CONVERT.

Ejemplo: convertir un valor de cadena a XML con tipo y asignarlo a una columna

En el ejemplo siguiente se convierte una variable de cadena que contiene un fragmento de XML al tipo de datos xml y, a continuación, se almacena en la columna de tipo xml :

CREATE TABLE T (
    c1 INT PRIMARY KEY,
    c2 XML
);
GO

DECLARE @s VARCHAR(100);

SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';

La siguiente operación de inserción se convierte implícitamente de una cadena al tipo xml :

INSERT INTO T
VALUES (3, @s);

Se puede convertir la cadena explícitamente con CAST al tipo xml:

INSERT INTO T
VALUES (3, CAST(@s AS XML));

O puedes usar CONVERT, como se muestra en el código de ejemplo:

INSERT INTO T
VALUES (3, CONVERT(XML, @s));

Ejemplo: convertir una cadena a XML con tipo y asignarla a una variable

En el ejemplo siguiente, se convierte una cadena a tipo xml y se asigna a una variable de tipo de datos xml :

DECLARE @x XML;
DECLARE @s VARCHAR(100);

SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
SET @x = CONVERT(XML, @s);

SELECT @x;

Use la instrucción SELECT con una cláusula FOR XML

Se puede utilizar la cláusula FOR XML en una instrucción SELECT para devolver resultados como XML. Por ejemplo:

DECLARE @xmlDoc XML;

SET @xmlDoc = (
        SELECT Column1, Column2
        FROM Table1, Table2
        WHERE <some_condition>
        FOR XML AUTO
)
...;

La instrucción SELECT devuelve un fragmento de XML de texto que a continuación se analiza durante la asignación a la variable de tipo de datos xml.

También se puede utilizar la directiva TYPE en consultas FOR XML en la cláusula FOR XML, lo que devuelve directamente un resultado de consulta FOR XML como tipo xml:

DECLARE @xmlDoc XML;

SET @xmlDoc = (
        SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID = 19
        FOR XML AUTO, TYPE
);

SELECT @xmlDoc;

El conjunto de resultados es el siguiente:

<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...

En el ejemplo siguiente, el resultado xml con tipo de una consulta FOR XML se inserta en una columna de tipo xml:

CREATE TABLE T1 (
    c1 INT,
    c2 XML
);
GO

INSERT T1 (c1, c2)
SELECT 1, (
        SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID = 19
        FOR XML AUTO, TYPE
);

SELECT *
FROM T1;
GO

Para obtener más información sobre FOR XML, consulta FOR XML (SQL Server).

Nota:

SQL Server devuelve instancias de tipo de datos xml al cliente como resultado de diferentes construcciones del servidor, como consultas FOR XML que utilizan la directiva TYPE, o cuando el tipo de datos xml se usa para devolver XML de columnas, variables y parámetros de salida del Motor de base de datos de SQL Server. En el código de la aplicación cliente, el proveedor ADO.NET solicita que la información de tipos de datos xml se envíe en una codificación binaria desde el servidor. No obstante, si se está utilizando FOR XML sin la directiva TYPE, los datos XML se devuelven como un tipo de cadena. En cualquier caso, el proveedor del cliente siempre podrá controlar cualquier formato de tipo XML.

Usar asignaciones de constantes

Se puede utilizar una constante de cadena cuando se espera una instancia de tipo de datos xml . Esta asignación es igual que una conversión CAST implícita de cadena a XML. Por ejemplo:

DECLARE @xmlDoc XML;

SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
-- Or
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>';

En el ejemplo anterior se convierte implícitamente la cadena al tipo de datos xml y se asigna a una variable de tipo xml .

En el ejemplo siguiente se inserta una cadena de constante en una columna de tipo xml :

CREATE TABLE T (
    c1 INT PRIMARY KEY,
    c2 XML
);

INSERT INTO T
VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>');

Nota:

El XML con tipo se valida con el esquema especificado. Para obtener más información, consulta Comparar XML con tipo y XML sin tipo.

Uso de la carga masiva

La funcionalidad mejorada OPENROWSET permite la carga masiva de documentos XML en la base de datos. Se pueden cargar de forma masiva instancias XML desde archivos a columnas de tipo xml de la base de datos. Para ver ejemplos de trabajo, consulta Ejemplos de importación y exportación masiva de documentos XML (SQL Server). Para obtener más información sobre cómo cargar documentos XML, consulta Cargar datos XML.

En esta sección

Artículo Descripción
Opciones de consulta XML y datos conservados Describe las partes de las instancias XML que no se conservan cuando se almacenan en bases de datos.