Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tópico descreve as diferenças gerais entre a formatação XML do lado do cliente e do servidor no SQLXML.
Várias consultas de conjunto de linhas sem suporte na formatação do lado do cliente
Não há suporte para consultas que geram vários conjuntos de linhas ao usar a formatação XML do lado do cliente. Por exemplo, suponha que você tenha um diretório virtual no qual você tenha a formatação do lado do cliente 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 esse modelo no código do aplicativo e um erro é retornado, pois a formatação XML do lado do cliente não dá suporte à formatação de vários conjuntos de linhas. Se você especificar as consultas em dois blocos sql:query> separados<, obterá os resultados desejados.
Mapas de carimbo de data/hora de forma diferente na formatação do lado do cliente vs. Servidor
Na formatação XML do lado do servidor, a coluna de banco de dados do timestamp tipo é 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 timestamp tipo é mapeada para o tipo XDR ou para o uribin.base64 tipo XDR (dependendo se a opção base64 binária é especificada na consulta). O bin.base64 tipo XDR será útil se você usar os recursos de updategram e bulkload, pois esse tipo é convertido no tipo do SQL Server timestamp . Dessa forma, a operação de inserção, atualização ou exclusão é bem-sucedida.
VARIANTs profundas são usadas na formatação do lado do servidor
Na formatação XML do lado do servidor, os tipos profundos de um tipo VARIANT são usados. Se você usar a formatação XML do lado do cliente, as variantes serão convertidas em cadeia de caracteres Unicode e os subtipos de VARIANT não serão usados.
Modo ANINHADO vs. Modo AUTO
O modo ANINHADO do FOR XML do lado do cliente é semelhante ao modo AUTO do 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 na AdventureWorksdatabase:
CREATE VIEW ContactView AS (SELECT ContactID as CID,
FirstName as FName,
LastName as LName
FROM Person.Contact)
O modelo a seguir especifica uma consulta no modo de exibição ContactView e também especifica a formatação XML do 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ê executa o modelo, o XML a seguir é retornado. (Somente os resultados parciais são mostrados.) Observe que os nomes dos elementos são os nomes dos modos de exibição nos 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 do lado do cliente usando o modo ANINHADO correspondente, os nomes da tabela base são retornados como os nomes 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 XML a seguir. 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 do FOR XML do lado do servidor, os aliases de 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 ANINHADO do FOR XML do lado do cliente, os nomes de tabela são retornados como nomes de 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 retorna 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 Foto como uma consulta dbobject. Nesta consulta dbobject, @P refere-se 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 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 xml do lado do cliente não é especificada e a opção Executar No Cliente não está selecionada para a raiz virtual). A consulta também especifica o modo AUTO (não o modo ANINHADO 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 este modelo é executado, o documento XML a seguir é 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>
Lado do cliente vs. XPath do lado do servidor
O XPath do lado do cliente e o XPath do lado do servidor funcionam da mesma forma, exceto por estas diferenças:
As conversões de dados aplicadas ao usar consultas XPath do lado do cliente são diferentes daquelas aplicadas quando você usa consultas XPath do lado do servidor. O XPath do lado do cliente usa CAST em vez do modo CONVERT 126.
Ao especificar 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 ANINHADO porque o servidor não reconhece a opção ANINHADA. Isso gera um erro. Você deve usar os modos AUTO, RAW ou EXPLICIT, que o servidor reconhece.
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 ANINHADO. Se você especificar FOR XML AUTO, a formatação XML ocorrerá no lado do servidor, embora client-side-xml="1" seja especificado no modelo.
Consulte Também
Considerações de segurança 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)