Compartir a través de


Formato XML del lado cliente frente al lado servidor (SQLXML 4.0)

En este tema se describen las diferencias generales entre el formato XML del lado cliente y del lado servidor en SQLXML.

No se admiten varias consultas de conjunto de filas en formato del lado cliente

Las consultas que generan varios conjuntos de filas no se admiten cuando se usa el formato XML del lado cliente. Por ejemplo, suponga que tiene un directorio virtual en el que tiene especificado el formato del lado cliente. Considere esta plantilla de ejemplo, que tiene dos instrucciones SELECT en un <bloque sql:query> :

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

Puede ejecutar esta plantilla en el código de la aplicación y se devuelve un error, ya que el formato XML del lado 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 forma diferente en formato del lado cliente frente al servidor

En el formato XML del lado servidor, la columna de base de datos de timestamp tipo se asigna al tipo XDR de i8 (cuando se especifica la opción XMLDATA en la consulta).

En el formato XML del lado cliente, la columna de base de datos de timestamp tipo se asigna al uri tipo O XDR bin.base64 (dependiendo de si la opción binaria base64 se especifica en la consulta). El bin.base64 tipo XDR es útil si usa las características del diagrama de actualización y la carga masiva, ya que este tipo se convierte en el tipo de SQL Server timestamp . De este modo, la operación de inserción, actualización o eliminación se realiza correctamente.

Los VARIANT profundos se usan en el formato del lado servidor

En el formato XML del lado servidor, se usan los tipos profundos de un tipo VARIANT. Si usa formato XML del lado cliente, las variantes se convierten en una cadena Unicode y no se usan los subtipos de VARIANT.

Modo ANIDADO frente al modo AUTO

El modo ANIDADO del FOR XML del lado cliente es similar al modo AUTO de FOR XML del lado servidor, con las siguientes excepciones:

Al consultar vistas mediante el modo AUTO en el servidor, el nombre de la vista se devuelve como el nombre del elemento en el XML resultante.

Por ejemplo, supongamos que la siguiente vista se crea en la tabla Person.Contact en adventureWorksdatabase:

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 también especifica el formato XML del lado 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 siguiente XML. (Solo se muestran resultados parciales). Tenga en cuenta 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 lado cliente mediante el modo NESTED correspondiente, los nombres de tabla base se devuelven como los nombres de elemento en el XML resultante. Por ejemplo, la siguiente plantilla revisada ejecuta la misma instrucción SELECT, pero el formato XML se realiza en el lado 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>  

La ejecución de esta plantilla genera el siguiente XML. Tenga en cuenta que el nombre del elemento es el nombre de la tabla base en este caso.

<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 usa el modo AUTO del FOR XML del lado servidor, los alias de tabla especificados en la consulta se devuelven como nombres de elemento en el XML resultante.

Por ejemplo, considere 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>  

La ejecución de la plantilla genera el siguiente XML:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <C fname="Gustavo" lname="Achong" />   
  <C fname="Catherine" lname="Abel" />   
...  
</ROOT>   

Cuando se usa el modo NESTED del FOR XML del lado cliente, los nombres de tabla se devuelven como nombres de elemento en el XML resultante. (No se usan alias de tabla especificados en la consulta). Por ejemplo, considere 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>  

La ejecución de la plantilla genera el siguiente XML:

<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 columnas como consultas dbobject, no puede usar alias para estas columnas.

Por ejemplo, considere la siguiente plantilla, 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 se devuelve la columna Photo 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 el formato XML se realiza en el servidor (client-side-xml="0"), puede usar el alias para las columnas que devuelven consultas dbobject en las que se devuelven nombres de tabla y columna reales (incluso si tiene alias especificados). Por ejemplo, la plantilla siguiente ejecuta una consulta y el formato XML se realiza en el servidor (no se especifica la opción client-side-xml y la opción Ejecutar en cliente no está seleccionada para la raíz virtual). La consulta también especifica el modo AUTO (no el modo NESTED del lado 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 siguiente documento XML (tenga en cuenta que los alias no se usan en la consulta dbobject de 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>  

Cliente frente a XPath del lado servidor

XPath del lado cliente y XPath del lado servidor funcionan igual, excepto por estas diferencias:

  • Las conversiones de datos que se aplican cuando se usan consultas XPath del lado cliente son diferentes de las que se aplican al usar consultas XPath del lado servidor. XPath del lado cliente usa CAST en lugar del modo CONVERT 126.

  • Al especificar client-side-xml="0" (false) en una plantilla, solicita el formato XML del lado servidor. Por lo tanto, no se puede especificar FOR XML NESTED porque el servidor no reconoce la opción NESTED. Esto genera un error. Debe usar los modos AUTO, RAW o EXPLICIT, que reconoce el servidor.

  • Al especificar client-side-xml="1" (true) en una plantilla, solicita formato XML del lado cliente. En este caso, puede especificar FOR XML NESTED. Si especifica FOR XML AUTO, el formato XML se produce en el lado servidor aunque se especifica client-side-xml="1" en la plantilla.

Véase también

Consideraciones de seguridad for XML (SQLXML 4.0)
Formato XML del lado cliente (SQLXML 4.0)
Formato XML del lado servidor (SQLXML 4.0)