Directrices de uso de la cláusula FOR XML

La cláusula FOR XML puede utilizarse en consultas de nivel superior y en subconsultas. La cláusula FOR XML de nivel superior sólo puede utilizarse en la instrucción SELECT. En el caso de las subconsultas, FOR XML puede utilizarse en las instrucciones INSERT, UPDATE y DELETE. También puede utilizarse en instrucciones de asignación. Por ejemplo:

DECLARE @x xml
SET @x = (SELECT *
FROM Sales.Customer
FOR XML AUTO, TYPE)
SELECT @x

Tenga en cuenta que la directiva TYPE devuelve el resultado de la consulta como de tipo xml. Si no se agrega la directiva de tipo, el resultado de la consulta FOR XML se devuelve como nvarchar(max). Después, se convierte a xml y se asigna a la variable de tipo xml.

La cláusula FOR XML está sujeta a las siguientes limitaciones:

  • La cláusula FOR XML no es válida en una selección que se utilice junto con una cláusula COMPUTE BY o FOR BROWSE. El siguiente ejemplo dará lugar a un error:

    SELECT TOP 5 SalesOrderID, UnitPrice 
    FROM Sales.SalesOrderDetail 
    ORDER BY SalesOrderID COMPUTE SUM(UnitPrice) BY SalesOrderID
    FOR XML AUTO
    
  • La cláusula FOR XML de nivel superior sin la directiva TYPE no puede utilizarse con cursores.

  • Cuando una instrucción SELECT con una cláusula FOR XML especifica un nombre de cuatro partes en la consulta, el nombre de servidor no se devuelve en el documento XML resultante cuando la consulta se ejecuta en el equipo local. Sin embargo, el nombre del servidor se devuelve como un nombre de cuatro partes cuando la consulta se ejecuta en un servidor de red.
    Por ejemplo, considere esta consulta:

    SELECT TOP 1 LastName
    FROM ServerName.AdventureWorks.Person.Contact
    FOR XML AUTO
    

    Cuando ServerName es un servidor local, la consulta devuelve lo siguiente:

    <AdventureWorks.Person.Contact LastName="Achong" />
    

    Cuando ServerName es un servidor de red, la consulta devuelve lo siguiente:

    <ServerName.AdventureWorks.Person.Contact LastName="Achong" />
    

    Se puede evitar esta ambigüedad especificando este alias:

    SELECT TOP 1 LastName
    FROM ServerName.AdventureWorks.Person.Contact x
    FOR XML AUTO 
    

    Esta consulta devuelve lo siguiente:

    <x LastName="Achong"/>
    

Además, los nombres de SQL Server que contienen caracteres que no son válidos en nombres XML, como espacios, se traducen a nombres XML, de forma que los caracteres no válidos se traduzcan a una codificación de entidad numérica de escape.

Sólo hay dos caracteres no alfabéticos que pueden incluirse en un nombre XML: los dos puntos (:) y el carácter de subrayado (_). Dado que el carácter de dos puntos está reservado para los espacios de nombres, se elige el subrayado como carácter de escape. A continuación se muestran las reglas de escape que se utilizan en la codificación:

  • Cualquier carácter UCS-2 que no sea válido como carácter de nombre XML, conforme a la especificación XML 1.0, se convierte en un carácter de escape con formato _xHHHH_. HHHH hace referencia al código UCS-2 hexadecimal de cuatro dígitos correspondiente al carácter que ocupa el primer lugar en función del bit más significativo. Por ejemplo, el nombre de tabla Order Details se codifica como Order_x0020_Details.

  • Los caracteres que no se ajustan al dominio UCS-2 (como las adiciones UCS-4 del intervalo de U+00010000 a U+0010FFFF) se codifican como _xHHHHHHHH_. HHHHHHHH hace referencia al código UCS-4 hexadecimal de ocho dígitos correspondiente al carácter, para el modo de compatibilidad con versiones anteriores de SQL Server 2000. De lo contrario, los caracteres se codifican como _xHHHHHH_, para ajustarse al estándar SQL-2003.

  • No es necesario convertir en carácter de escape el carácter de subrayado, a menos que vaya seguido del carácter x. Por ejemplo, no es necesario codificar el nombre de tabla Order_Details.

  • Los dos puntos de los identificadores no se convierten en un carácter de escape, por lo que la consulta FOR XML puede generar nombres de elementos y atributos de espacio de nombres. Por ejemplo, la siguiente consulta genera un atributo de espacio de nombres con un carácter de dos puntos en el nombre:

    SELECT 'namespace-urn' as 'xmlns:namespace', 
     1 as 'namespace:a' 
    FOR XML RAW
    

    La consulta genera este resultado:

    <row xmlns:namespace="namespace-urn" namespace:a="1"/>
    

    Tenga en cuenta que el uso de WITH XMLNAMESPACES es la forma recomendada de agregar espacios de nombres XML.

  • En una consulta SELECT, la conversión de una columna en un objeto binario grande (BLOB) convierte a la columna en una entidad temporal en la que pierde su nombre asociado de tabla y de columna. Esto hace que las consultas en modo AUTO generen un error, ya que no sabe dónde colocar este valor en la jerarquía XML. Por ejemplo:

    CREATE TABLE MyTable (Col1 int PRIMARY KEY, Col2 binary)
    INSERT INTO MyTable VALUES (1, 0x7)
    

    Esta consulta produce un error debido a la conversión en un objeto binario grande (BLOB):

    SELECT Col1,
    CAST(Col2 as image) as Col2
    FROM MyTable
    FOR XML AUTO
    

    La solución consiste en agregar la opción BINARY BASE64 a la cláusula FOR XML. Si se quita la conversión, la consulta produce los resultados esperados:

    SELECT Col1,
    Col2
    FROM MyTable
    FOR XML AUTO
    

    El resultado es el siguiente:

    <MyTable Col1="1" Col2="dbobject/MyTable[@Col1='1']/@Col2" />
    
  • En SQL Server 2000, el resultado de FOR XML puede incluir caracteres XML no válidos. Por ejemplo, el valor hexadecimal 7 se utiliza como carácter de formato, pero no suele ser visible por lo demás como texto en el resultado. Ahora, SQL Server 2005 crea entidades de este tipo de caracteres cuando se devuelven en consultas FOR XML que no utilizan la directiva TYPE.
    Aunque los analizadores compatibles con XML 1.0 generan errores de análisis, independientemente de que se hayan creado o no entidades con estos caracteres, el uso de estos caracteres con entidades se ajusta mejor a XML 1.1. El uso de estos caracteres con entidades también se ajusta mejor a las futuras versiones del estándar XML. Además, simplifica la depuración, porque el punto de código del carácter no válido pasa a ser visible.
    Los usuarios de herramientas XML no necesitan ninguna solución porque el analizador XML generará errores de todos modos en el punto de la secuencia de datos donde haya caracteres no válidos. Si se utilizan herramientas no XML, este cambio puede exigir la actualización de la lógica de programación para poder buscar estos caracteres como valores con entidades.

  • En SQL Server 2005, la forma de crear entidades de los siguientes caracteres de espacio en blanco en consultas FOR XML ha cambiado, para conservar su presencia a lo largo de los recorridos de ida y vuelta:

    • En contenido de elemento y atributos: hex(0D) (retorno de carro)
    • En contenido de atributo: hex(09) (tab), hex(0A) (avance de línea)

    Esto puede afectar a la aplicación si se diseñó originalmente para controlar el resultado de SQL Server 2000 donde se normalizaban estos caracteres. Ahora, en el resultado de SQL Server 2005 se conservarán estos caracteres y ya no será un analizador quien se encargue de normalizarlos.

Vea también

Referencia

Generar XML mediante FOR XML

Otros recursos

SELECT (Transact-SQL)

Ayuda e información

Obtener ayuda sobre SQL Server 2005