Formatação XML no lado cliente e no lado servidor (SQLXML 4.0)
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 no lado do servidor, a coluna do banco de dados do tipo timestamp mapeia para o tipo i8 XDR (quando a opção XMLDATA é especificada na consulta).
Na formatação XML no lado cliente, a coluna do banco de dados do tipo timestamp mapeia para o tipo uri ou para o tipo XDR bin.base64 (dependendo se a opção base64 binária é especificada na consulta). O tipo XDR bin.base64 é útil se você usa os recursos diagrama de atualização e carregamento em massa, pois esse tipo é convertido ao tipo SQL Servertimestamp. 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, supondo que a exibição a seguir seja criada na tabela Person.Contact do 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 serão mostrados) Observe que os nomes do elemento são os nomes das exibições em que as consultas são executadas.
<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 (isto é, 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 da tabela que são 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 em que os nomes de coluna e tabela reais 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 na 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, 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.
Quando você especifica client-side-xml="1" (true) em um modelo, 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 cliente-lado-xml = "1" seja especificado no modelo.