
Diferencias entre el modo NESTED y el modo AUTO
El modo NESTED de la instrucción FOR XML del cliente es similar al modo AUTO de la instrucción FOR XML del servidor, con las siguientes excepciones:
Al consultar vistas utilizando el modo AUTO en el servidor, el nombre de la vista se devuelve como el nombre del elemento en el código XML resultante.
Supongamos, por ejemplo, que se crea la vista siguiente en la tabla Person.Contact de la base de datos AdventureWorks:
CREATE VIEW ContactView AS (SELECT ContactID as CID,
FirstName as FName,
LastName as LName
FROM Person.Contact)
La plantilla siguiente especifica una consulta en la vista ContactView y especifica también que la aplicación de formato XML se realice en el servidor:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="0">
SELECT *
FROM ContactView
FOR XML AUTO
</sql:query>
</ROOT>
Al ejecutar la plantilla, se devuelve el código XML siguiente. (Sólo se muestran resultados parciales). Observe que los nombres de elemento son los nombres de las vistas en las que se ejecuta la consulta.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ContactView CID="1" FName="Gustavo" LName="Achong" />
<ContactView CID="2" FName="Catherine" LName="Abel" />
...
</ROOT>
Al especificar el formato XML del cliente utilizando el modo NESTED correspondiente, los nombres de la tabla base se devuelven como los nombres de elemento en el código XML resultante. Por ejemplo, la siguiente plantilla modificada ejecuta la misma instrucción SELECT, pero la aplicación de formato XML se realiza en el cliente (es decir, client-side-xml se establece en true en la plantilla):
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="1">
SELECT *
FROM ContactView
FOR XML NESTED
</sql:query>
</ROOT>
Al ejecutar esta plantilla, se genera el código XML siguiente. Observe que, en este caso, el nombre del elemento es el nombre de la tabla base.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Person.Contact CID="1" FName="Gustavo" LName="Achong" />
<Person.Contact CID="2" FName="Catherine" LName="Abel" />
...
</ROOT>
Cuando se utiliza el modo AUTO de la instrucción FOR XML del servidor, los alias de tabla especificados en la consulta se devuelven como nombres de elemento en el código XML resultante.
Por ejemplo, fíjese en esta plantilla:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="0">
SELECT FirstName as fname,
LastName as lname
FROM Person.Contact C
FOR XML AUTO
</sql:query>
</ROOT>
Al ejecutar la plantilla, se genera el código XML siguiente:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<C fname="Gustavo" lname="Achong" />
<C fname="Catherine" lname="Abel" />
...
</ROOT>
Cuando se utiliza el modo NESTED de la instrucción FOR XML del cliente, los nombres de tabla se devuelven como nombres de elemento en el código XML resultante. (No se utilizan los alias de tabla especificados en la consulta). Por ejemplo, fíjese en esta plantilla:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="1">
SELECT FirstName as fname,
LastName as lname
FROM Person.Contact C
FOR XML NESTED
</sql:query>
</ROOT>
Al ejecutar la plantilla, se genera el código XML siguiente:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Person.Contact fname="Gustavo" lname="Achong" />
<Person.Contact fname="Catherine" lname="Abel" />
...
</ROOT>
Si tiene una consulta que devuelve las columnas como consultas dbobject, no puede utilizar alias para estas columnas.
Por ejemplo, fíjese en la plantilla siguiente, que ejecuta una consulta que devuelve un identificador de empleado y una foto.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query client-side-xml="1">
SELECT ProductPhotoID, LargePhoto as P
FROM Production.ProductPhoto
WHERE ProductPhotoID=5
FOR XML NESTED, elements
</sql:query>
</ROOT>
Al ejecutar esta plantilla, la columna Photo se devuelve como una consulta dbobject. En esta consulta dbobject, @P hace referencia a un nombre de columna que no existe.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Production.ProductPhoto>
<ProductPhotoID>5</ProductPhotoID>
<LargePhoto>dbobject/Production.ProductPhoto[@ProductPhotoID='5']/@P</LargePhoto>
</Production.ProductPhoto>
</ROOT>
Si la aplicación de formato XML se realiza en el servidor (client-side-xml="0"), puede usar los alias para las columnas que devuelven consultas dbobject en las que se devuelven los nombres de tabla y columna reales (aunque haya especificado alias). Por ejemplo, la plantilla siguiente ejecuta una consulta, y la aplicación de formato XML se realiza en el servidor (no se especifica la opción client-side-xml y la opción Ejecutar en el cliente no está seleccionada para la raíz virtual). La consulta especifica también el modo AUTO (no el modo NESTED del cliente).
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query
SELECT ProductPhotoID, LargePhoto as P
FROM Production.ProductPhoto
WHERE ProductPhotoID=5
FOR XML AUTO, elements
</sql:query>
</ROOT>
Cuando se ejecuta esta plantilla, se devuelve el documento XML siguiente (observe que no se utilizan alias en la consulta dbobject para la columna LargePhoto):
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Production.ProductPhoto>
<ProductPhotoID>5</ProductPhotoID>
<LargePhoto>dbobject/Production.ProductPhoto[@ProductPhotoID='5']/@LargePhoto</LargePhoto>
</Production.ProductPhoto>
</ROOT>
Diferencias entre XPath en el cliente y en el servidor
No existen diferencias de funcionamiento entre XPath en el cliente y en el servidor, con las siguientes salvedades:
-
Las conversiones de datos que se aplican al utilizar consultas XPath en el cliente son diferentes de las que se aplican cuando se utilizan consultas XPath en el servidor. XPath en el cliente utiliza CAST en lugar de CONVERT mode 126.
-
Cuando se especifica client-side-xml ="0" (false) en una plantilla, se solicita que la aplicación de formato XML se realice en el servidor. Por lo tanto, no es posible especificar FOR XML NESTED porque el servidor no reconoce la opción NESTED. Esto genera un error. Deben utilizarse los modos AUTO, RAW o EXPLICIT, que el servidor sí que reconoce.
-
Cuando se especifica client-side-xml ="1" (true) en una plantilla, se solicita que la aplicación de formato XML se realice en el cliente. En este caso, puede especificarse FOR XML NESTED. Si se especifica FOR XML AUTO, la aplicación de formato XML se realiza en el servidor aunque se haya especificado client-side-xml="1" en la plantilla.