Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia
administrada de Azure SQLBase de datos SQL en Microsoft Fabric
Cuando el tipo de datos xml se convierte de manera explícita o implícita a un tipo SQL binario o de cadena, el contenido del tipo de datos xml se serializará de acuerdo con las reglas descritas en este artículo.
Codificación de serialización
Si el tipo SQL de destino es VARBINARY, el resultado se serializa en UTF-16 con una marca de orden de bytes UTF-16 delante, pero sin una declaración XML. Si el tipo de destino es demasiado pequeño, se genera un error.
Por ejemplo:
select CAST(CAST(N'<Δ/>' as XML) as VARBINARY(MAX))
El resultado es el siguiente:
0xFFFE3C0094032F003E00
Si el tipo SQL de destino es NVARCHAR o NCHAR, el resultado se serializa en UTF-16 sin una marca de orden de bytes y sin una declaración XML. Si el tipo de destino es demasiado pequeño, se genera un error.
Por ejemplo:
select CAST(CAST(N'<Δ/>' as XML) as NVARCHAR(MAX))
El resultado es el siguiente:
<Δ/>
Si el tipo SQL de destino es VARCHAR o CHAR, el resultado se serializa en la codificación que corresponda a la página de códigos de intercalación de la base de datos, sin una marca de orden de bytes ni una declaración XML. Si el tipo de destino es demasiado pequeño o el valor no se puede asignar a la página de códigos de intercalación de destino, se genera un error.
Por ejemplo:
select CAST(CAST(N'<Δ/>' as XML) as VARCHAR(MAX))
Esto puede producir un error, si la página de códigos de la intercalación actual no puede representar el carácter Unicode Δ, o lo representará en la codificación específica.
Cuando se devuelven los resultados XML al cliente, los datos se envían codificados como UTF-16. Después, el proveedor del lado cliente expondrá los datos de acuerdo con sus reglas de API.
Serialización de las estructuras XML
El contenido de un tipo de datos xml se serializa de la forma habitual. Concretamente, los nodos de elementos se asignan a marcado de elemento y los nodos de texto se asignan a contenido de texto. No obstante, en las siguientes secciones se describen las circunstancias en las que los caracteres se sustituyen por entidades y cómo se serializan los valores atómicos tipados.
Creación de entidades para caracteres XML durante la serialización
Todas las estructuras XML serializadas deberían poder analizarse de nuevo. Por tanto, algunos caracteres deben serializarse como entidades para que conserven su funcionalidad de ida y vuelta durante la fase de normalización del analizador XML. Sin embargo, deben crearse entidades para algunos caracteres con el fin de que el formato del documento sea correcto, y, por tanto, se pueda analizar. A continuación se exponen las reglas de creación de entidades que se aplican durante la serialización:
Los caracteres &, < y > se sustituyen siempre por las entidades
&,<y>, respectivamente, si aparecen dentro del valor de un atributo o del contenido de un elemento.Dado que SQL Server usa comillas (U+0022) para incluir los valores de los atributos, para las comillas de los valores de atributo se crea la entidad
".La entidad que se crea para un par suplente es una única referencia de carácter numérico, solo cuando la conversión se realiza en el servidor. Por ejemplo, el par sustituto U+D800 U+DF00 está autorizado para la referencia de carácter numérico
𐌀.Para proteger una TABULA (U+0009) y un avance de línea (LF, U+000A) de que se normalicen durante el análisis, se les asignan las referencias de caracteres numéricos
	y
, respectivamente, dentro de los valores de atributo.Para evitar que se normalice un retorno de carro (CR, U+000D) durante el análisis, se le asigna la entidad a su referencia de caracteres numéricos,

dentro de los valores de atributo y el contenido del elemento.Para proteger los nodos de texto que solo contienen espacios en blanco, se crea una entidad para uno de los caracteres de espacio en blanco, generalmente el último, que se corresponde con su referencia de carácter numérico. De esta manera, cuando se vuelve a realizar el análisis, se conserva el nodo de texto de espacio en blanco independientemente de la configuración del control de espacios en blanco durante el análisis.
Por ejemplo:
DECLARE @u NVARCHAR(50)
set @u = N'<a a="
'+NCHAR(0xD800)+NCHAR(0xDF00)+N'>"> '+NCHAR(0xA)+N'</a>'
SELECT CAST(CONVERT(XML,@u,1) as NVARCHAR(50));
El resultado es el siguiente:
<a a="
𐌀>">
</a>
Si no quiere aplicar la regla de protección del último espacio en blanco, puede usar la opción explícita de CONVERT 1 al convertir el tipo xml en un tipo de cadena o binario. Por ejemplo, para evitar la creación de entidades, tiene las opciones siguientes:
SELECT CONVERT(NVARCHAR(50), CONVERT(XML, '<a> </a>', 1), 1);
El método query() (tipo de datos xml) genera una instancia de tipo de datos xml. Por tanto, cualquier resultado del método query() que se convierta en un tipo de cadena o binario se convierte en entidades de acuerdo con las reglas descritas anteriormente. Si quiere obtener los valores de cadena que no están convertidos en entidades, debe usar el método value() (tipo de datos XML) en su lugar. A continuación se ofrece un ejemplo de uso del método query():
DECLARE @x xml
SET @x = N'<a>This example contains an entitized char: .</a>'
SELECT @x.query('/a/text()');
El resultado es el siguiente:
This example contains an entitized char: .
A continuación se ofrece un ejemplo de uso del método value():
SELECT @x.value('(/a/text())[1]', 'nvarchar(100)');
El resultado es el siguiente:
This example contains an entitized char: .
Serializar un tipo de datos XML tipado
Una instancia del tipo de datos xml tipada contiene valores tipados según los tipos definidos en su esquema XML. Estos valores se serializan según su tipo de esquema XML, en el mismo formato que genera la conversión XQuery a xs:string. Para obtener más información, vea Reglas de conversión de tipos en XQuery.
Por ejemplo, el valor 1.34e1 de tipo xs:double se serializa como 13.4, como se observa en el ejemplo siguiente:
declare @x xml
set @x =''
select CAST(@x.query('1.34e1') as nvarchar(50));
Se obtiene el valor de cadena 13.4.