Partilhar via


Formatação XML no lado cliente e no lado servidor (SQLXML 4.0)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Este tópico descreve as diferenças gerais entre a formatação XML no lado cliente e no lado servidor no SQLXML.

Várias consultas a conjuntos de linhas sem suporte na formatação no lado do cliente

Consultas que geram vários conjuntos de linha não têm suporte quando você usa a formatação XML no lado do cliente. Por exemplo, suponha que você tenha um diretório virtual em que a formatação no lado do cliente seja especificada. Considere este modelo de exemplo, que tem duas instruções SELECT em um <bloco 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>  

Você pode executar este modelo em código do aplicativo e um erro será retornado, porque a formatação XML no lado do cliente não dá suporte à formatação de vários conjuntos de linha. Se você especificar as consultas em dois blocos sql:query> separados<, obterá os resultados desejados.

Carimbo de data e hora mapeia de forma diferente as formatações no lado do cliente e no lado do servidor

Na formatação XML do lado do servidor, a coluna de banco de dados do tipo timestamp é mapeada para o tipo XDR i8 (quando a opção XMLDATA é especificada na consulta).

Na formatação XML do lado do cliente, a coluna de banco de dados do tipo timestamp é mapeada para o tipo XDR uri ou bin.base64 (dependendo se a opção binária base64 é especificada na consulta). O tipo XDR bin.base64 é útil se você usar os recursos updategram e bulkload, pois esse tipo é convertido no tipo de carimbo de data/hora do SQL Server. Deste modo, as operações de inserção, atualização ou exclusão são bem-sucedidas.

VARIANTs profundas são usadas na formatação no lado do servidor

Na formatação no lado do servidor, os tipos profundos de um tipo VARIANT são usados. Se você usar uma formatação XML no lado do cliente, as variantes serão convertidas à cadeia de caracteres Unicode e os subtipos de VARIANT não serão usados.

Modo NESTED e modo AUTO

O modo NESTED de FOR XML do lado do cliente é semelhante ao modo AUTO de FOR XML do lado do servidor, com as seguintes exceções:

Quando você consulta exibições usando o modo AUTO no lado do servidor, o nome da exibição é retornado como o nome do elemento no XML resultante.

Por exemplo, suponha que a seguinte exibição seja criada na tabela Person.Contact no banco de dados AdventureWorks:

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

O modelo a seguir especifica uma consulta na exibição ContactView e também uma formatação XML no lado do 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>  

Quando você executar o modelo, o seguinte XML será retornado: (Somente resultados parciais são mostrados.) Observe que os nomes dos elementos são os nomes das exibições nas quais a consulta é executada.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <ContactView CID="1" FName="Gustavo" LName="Achong" />   
  <ContactView CID="2" FName="Catherine" LName="Abel" />   
...  
</ROOT>  

Quando você especifica a formatação XML no lado cliente usando o modo NESTED correspondente, o(s) nome(s) da tabela base são retornados como nome(s) do elemento no XML resultante. Por exemplo, o modelo revisado a seguir executa a mesma instrução SELECT, mas a formatação XML é executada no lado do cliente (ou seja, client-side-xml é definido como true no modelo):

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
  <sql:query client-side-xml="1">  
    SELECT *  
    FROM   ContactView  
    FOR XML NESTED  
  </sql:query>  
</ROOT>  

A execução desse modelo produz o seguinte XML: Observe que o nome do elemento é o nome da tabela base, nesse 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>  

Quando você usa o modo AUTO de FOR XML no lado do servidor, os aliases da tabela especificados na consulta são retornados como nomes de elemento no XML resultante.

Por exemplo, considere este modelo:

<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>  

A execução do modelo produz o seguinte XML:

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

Quando você usa o modo NESTED de FOR XML no lado do cliente, os nomes da tabela são retornados como nomes do elemento no XML resultante. (Os aliases de tabela especificados na consulta não são usados.) Por exemplo, considere este modelo:

<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>  

A execução do modelo produz o seguinte XML:

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

Se você tiver uma consulta que retorne colunas como consultas dbobject, não poderá usar aliases para essas colunas.

Por exemplo, considere o modelo a seguir, que executa uma consulta que retorna uma ID de funcionário e uma 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>  

A execução desse modelo retorna a coluna Photo como consulta dbobject. Nessa consulta dbobject, @P se refere a um nome de coluna que não 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>  

Se a formatação XML for feita no servidor (client-side-xml="0"), você poderá usar o alias para as colunas que retornam consultas dbobject nas quais os nomes reais de tabela e coluna são retornados (mesmo se você tiver aliases especificados). Por exemplo, o modelo a seguir executa uma consulta e a formatação XML é feita no servidor (a opção client-side-xml não é especificada e a opção Run On Client não é selecionada para a raiz virtual). A consulta também especifica o modo AUTO (não o modo NESTED do lado do 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>  

Quando esse modelo é executado, o seguinte documento XML é retornado (observe que os aliases não são usados na consulta dbobject para a coluna 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>  

XPath do lado do cliente e do lado do servidor

O XPath funciona da mesma forma no lado do cliente e no lado do servidor, exceto por estas diferenças:

  • As conversões de dados que são aplicadas quando você usa consultas XPath no lado do cliente são diferentes das aplicadas quando você usa consultas XPath no lado do servidor. XPath no lado do cliente usa o modo CAST em vez de CONVERT mode 126.

  • Quando você especifica client-side-xml="0" (false) em um modelo, você está solicitando a formatação XML do lado do servidor. Portanto, você não pode especificar FOR XML NESTED porque o servidor não reconhece a opção ANINHADO. Isso gera um erro. Você deve usar os modos AUTO, RAW ou EXPLICIT, reconhecidos pelo servidor.

  • Ao especificar client-side-xml="1" (true) em um modelo, você está solicitando a formatação XML do lado do cliente. Nesse caso, você pode especificar FOR XML NESTED. Se você especificar FOR XML AUTO, a formatação XML ocorrerá no lado do servidor, embora client-side-xml="1" seja especificado no modelo.

Confira também

Considerações de segurança de FOR XML (SQLXML 4.0)
Formatação XML do lado do cliente (SQLXML 4.0)
Formatação XML do lado do servidor (SQLXML 4.0)