Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada SQL do Azure
Este tópico descreve as diferenças gerais entre a formatação XML do lado do cliente e do lado do servidor em SQLXML.
Consultas de múltiplos conjuntos de linhas não suportadas na formatação do lado do cliente
Consultas que geram múltiplos conjuntos de linhas não são suportadas quando se utiliza formatação XML do lado do cliente. Por exemplo, suponha que tem um diretório virtual onde tem a formatação do lado do cliente especificada. Considere este modelo de exemplo, que tem duas instruções SELECT num <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>
Pode executar este modelo em código de aplicação e um erro é devolvido, porque a formatação XML do lado do cliente não suporta a formatação de múltiplos conjuntos de linhas. Se especificar as consultas em dois blocos sql:>query separados<, obterá os resultados desejados.
Os mapas de carimbo temporal de forma diferente na formatação do cliente vs. do lado do servidor
Na formatação XML do lado do servidor, a coluna da base de dados do tipo de carimbo temporal mapeia para o tipo i8 XDR (quando a opção XMLDATA é especificada na consulta).
Na formatação XML do lado do cliente, a coluna da base de dados com o tipo de carimbo temporal corresponde ao URI ou ao tipo bin.base64 XDR (dependendo se a opção binária base64 está especificada na consulta). O tipo XDR bin.base64 é útil se usar as funcionalidades updategram e bulkload, porque este tipo é convertido para o tipo de carimbo temporal do SQL Server. Desta forma, a operação de inserção, atualização ou eliminação é bem-sucedida.
Os VARIANTs profundos são usados na formatação do lado do servidor
Na formatação XML do lado do servidor, são usados os tipos profundos de um tipo VARIANT. Se usar formatação XML do lado do cliente, as variantes são convertidas para strings Unicode, e os subtipos de VARIANT não são utilizados.
Modo ANINHADO vs. Modo AUTO
O modo ANINHADO do lado do cliente PARA XML é semelhante ao modo AUTO do lado do servidor PARA XML, com as seguintes exceções:
Quando consultas as vistas usando o modo AUTO do lado do servidor, o nome da vista é devolvido como o nome do elemento no XML resultante.
Por exemplo, assuma que a seguinte vista é criada na tabela Person.Contact na base de dados AdventureWorks:
CREATE VIEW ContactView AS (SELECT ContactID as CID,
FirstName as FName,
LastName as LName
FROM Person.Contact)
O modelo seguinte especifica uma consulta na vista 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 executa o modelo, o seguinte XML é devolvido. (Apenas resultados parciais são mostrados.) Note que os nomes dos elementos são os nomes das vistas contra as 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 especifica a formatação XML do lado do cliente usando o modo NESTED correspondente, o(s) nome(s) base(s) da tabela são devolvidos como o(s) nome(s) dos elementos no XML resultante. Por exemplo, o seguinte modelo revisto executa a mesma instrução SELECT, mas a formatação XML é feita do lado do cliente (ou seja, o xml do lado do cliente é definido como verdadeiro 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>
Executar este modelo produz o seguinte XML. Note que o nome do elemento é o nome da tabela base neste 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 se usa o modo AUTO do lado do servidor FOR XML, os alias de tabela especificados na consulta são devolvidos como nomes de elementos 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>
Executar o template 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 usa o modo NESTED do lado do cliente FOR XML, os nomes das tabelas são devolvidos como nomes de elementos no XML resultante. (Os alias de tabela especificados na consulta não são utilizados.) 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>
Executar o template 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 tiveres uma consulta que devolve colunas como consultas dbobject, não podes usar aliases para essas colunas.
Por exemplo, considere o seguinte modelo, que executa uma consulta que devolve um ID de funcionário e uma fotografia.
<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>
Executar este modelo devolve a coluna Foto como uma consulta dbobject. Nesta consulta de 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 (cliente-side-xml="0"), pode usar o alias para as colunas que retornam consultas dbobject nas quais os nomes reais das tabelas e colunas são devolvidos (mesmo que tenha aliases especificados). Por exemplo, o modelo seguinte 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 Cliente não está 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 este modelo é executado, o seguinte documento XML é devolvido (note que os aliases não são usados na consulta ao objeto 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 vs. 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 quando usas consultas XPath do lado do cliente são diferentes daquelas aplicadas quando usas consultas XPath do lado do servidor. O XPath do lado do cliente usa CAST em vez do modo CONVERT 126.
Quando especifica cliente-side-xml="0" (false) num template, está a pedir formatação XML do lado do servidor. Portanto, não pode especificar O PARA XML NESTED porque o servidor não reconhece a opção NESTED. Isso gera um erro. Deve usar os modos AUTO, RAW ou EXPLICIT, que o servidor reconhece.
Quando especifica o lado do cliente-xml="1" (verdadeiro) num modelo, está a pedir formatação XML do lado do cliente. Neste caso, podes especificar FOR XML NESTED. Se especificar FOR XML AUTO, a formatação XML ocorre do lado do servidor, embora o lado do cliente-xml="1" esteja especificado no modelo.
Ver também
PARA Considerações de Segurança XML (SQLXML 4.0)
Formatação XML do lado do cliente (SQLXML 4.0)
Formatação XML do lado do servidor (SQLXML 4.0)