Compartir a través de


Diferencias de aplicación de formato XML entre el cliente y el servidor (SQLXML 4.0)

En este tema se describen las diferencias generales que existen entre la aplicación de formato XML en el cliente y en el servidor en SQLXML.

En el formato del cliente, no se admiten consultas de varios conjuntos de filas

Cuando la aplicación de formato XML se realiza en el cliente, no se admiten consultas que generen varios conjuntos de filas. Supongamos, por ejemplo, que tiene un directorio virtual en el que ha especificado que la aplicación formato se realice en el cliente. Fíjese en esta plantilla de ejemplo, que incluye dos instrucciones SELECT en un bloque <sql:query>:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <sql:query>
     SELECT FirstName FROM Person.Person FOR XML Nested; 
     SELECT LastName FROM Person.Person FOR XML Nested  
  </sql:query>
</ROOT>

Si ejecuta esta plantilla en el código de la aplicación, se devolverá un error, puesto que el formato XML del cliente no admite el formato de varios conjuntos de filas. Si especifica las consultas en dos bloques <sql:query> independientes, obtendrá los resultados deseados.

timestamp se asigna de distinto modo cuando la aplicación de formato se realiza en el cliente o en el servidor

Cuando la aplicación de formato XML se realiza en el servidor, la columna de base de datos de tipo timestamp se asigna al tipo XDR i8 (cuando se ha especificado en la consulta la opción XMLDATA).

Cuando la aplicación de formato XML se realiza en el cliente, la columna de base de datos de tipo timestamp se asigna al tipo XDR uri o bin.base64 (en función de si se ha especificado en la consulta la opción binary base64). El tipo XDR bin.base64 resulta de gran utilidad si se usan las características de diagrama de actualización y copia masiva, ya que este tipo se convierte en el tipo timestamp de SQL Server. De esta forma, las operaciones de inserción, actualización o eliminación se realizan correctamente.

En el formato del servidor se usan tipos VARIANT profundos

En la aplicación de formato XML en el servidor, se usan los tipos profundos de un tipo VARIANT. Si aplica el formato XML en el cliente, los datos VARIANT se convierten en una cadena Unicode y no se usan los subtipos de VARIANT.

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.Person de la base de datos AdventureWorks2008R2:

CREATE VIEW ContactView AS (SELECT BusinessEntityID as CID,
                               FirstName  as FName,
                               LastName  as LName
                        FROM Person.Person);

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.Person CID="1" FName="Gustavo" LName="Achong" /> 
  <Person.Person 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.Person AS 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.Person 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.Person fname="Gustavo" lname="Achong" /> 
  <Person.Person 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=&apos;5&apos;]/@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=&apos;5&apos;]/@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.