Compartilhar via


Usar resultados de FOR XML no código de aplicações

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureBanco de dados SQL no Microsoft Fabric

Usando cláusulas FOR XML com consultas SQL, você pode recuperar e converter resultados de consulta como dados XML. Ao usar os resultados da consulta FOR XML no código do aplicativo XML, você pode:

Este artigo fornece exemplos que demonstram essas abordagens.

Recuperar dados FOR XML com ADO (ActiveX Data Objects) e ilhas de dados XML

O objeto ADO Stream ou outros objetos que dão suporte à interface COM IStream , como os objetos solicitação e resposta do ASP (Active Server Pages), podem conter os resultados quando você está trabalhando com consultas FOR XML.

Por exemplo, o código ASP a seguir mostra os resultados de consulta a uma coluna de tipo de dados xml, Demographics, na tabela Sales.Store do banco de dados de exemplo do AdventureWorks. Especificamente, a consulta procura pelo valor da instância dessa coluna para a linha em que CustomerID é igual a 3.

<!-- BeginRecordAndStreamVBS -->
<%@ LANGUAGE = VBScript %>
<!-- %  Option Explicit  % -->
<!-- 'Request.ServerVariables("SERVER_NAME") & ";" & _ -->
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Developer Studio"/>
<META HTTP-EQUIV="Content-Type" content="text/html"; charset="iso-8859-1">
<TITLE>FOR XML Query Example</TITLE>
<STYLE>
   BODY
   {
      FONT-FAMILY: Tahoma;
      FONT-SIZE: 8pt;
      OVERFLOW: auto
   }
   H3
   {
      FONT-FAMILY: Tahoma;
      FONT-SIZE: 8pt;
      OVERFLOW: auto
   }
</STYLE>

<!-- #include file="adovbs.inc" -->
<%
   Response.Write "<H3>Server-side processing</H3>"
   Response.Write "Page Generated @ " & Now() & "<BR/>"
   Dim adoConn
   Set adoConn = Server.CreateObject("ADODB.Connection")
   Dim sConn
   sConn = "Provider=SQLOLEDB;Data Source=(local);" & _
            "Initial Catalog=AdventureWorks;Integrated Security=SSPI;"
   Response.write "Connect String = " & sConn & "<BR/>"
   adoConn.ConnectionString = sConn
   adoConn.CursorLocation = adUseClient
   adoConn.Open
   Response.write "ADO Version = " & adoConn.Version & "<BR/>"
   Response.write "adoConn.State = " & adoConn.State & "<BR/>"
   Dim adoCmd
   Set adoCmd = Server.CreateObject("ADODB.Command")
   Set adoCmd.ActiveConnection = adoConn
   Dim sQuery
   sQuery = "<ROOT xmlns:sql='urn:schemas-microsoft-com:xml-sql'><sql:query>SELECT Demographics from Sales.Store WHERE CustomerID = 3 FOR XML AUTO</sql:query></ROOT>"
   Response.write "Query String = " & sQuery & "<BR/>"
   Dim adoStreamQuery
   Set adoStreamQuery = Server.CreateObject("ADODB.Stream")
   adoStreamQuery.Open
   adoStreamQuery.WriteText sQuery, adWriteChar
   adoStreamQuery.Position = 0
   adoCmd.CommandStream = adoStreamQuery
   adoCmd.Dialect = "{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"
   Response.write "Pushing XML to client for processing "  & "<BR/>"
   adoCmd.Properties("Output Stream") = Response
   Response.write "<XML ID='MyDataIsle'>"
   adoCmd.Execute , , 1024
   Response.write "</XML>"
%>
<SCRIPT language="VBScript" For="window" Event="onload">
   Dim xmlDoc
   Set xmlDoc = MyDataIsle.XMLDocument
   Dim root
   Set root = xmlDoc.documentElement.childNodes.Item(0).childNodes.Item(0).childNodes.Item(0)
   For each child in root.childNodes
      dim OutputXML
      OutputXML = document.all("log").innerHTML
      document.all("log").innerHTML = OutputXML & "<LI><B>" & child.nodeName &  ":</B>  " & child.Text  & "</LI>"
   Next
   MsgBox xmlDoc.xml
</SCRIPT>
</HEAD>
<BODY>
   <H3>Client-side processing of XML Document MyDataIsle</H3>
   <UL id=log>
   </UL>
</BODY>
</HTML>
<!-- EndRecordAndStreamVBS -->

Essa página ASP de exemplo contém VBScript do lado do servidor que usa ADO para executar a consulta FOR XML e retorna os resultados XML em uma ilha de dados XML, MyDataIsle. Em seguida, o navegador recebe essa ilha de dados XML para processamento adicional do lado do cliente. Código VBScript adicional do lado do cliente processa o conteúdo da ilha de dados XML, exibindo o conteúdo como parte do DHTML resultante e abrindo uma caixa de mensagem para mostrar o conteúdo pré-processado da ilha de dados XML.

Testar este exemplo

  1. Verifique se o IIS e o banco de dados de exemplo AdventureWorks para SQL Server estão instalados.

    Este exemplo requer o IIS (Serviços de Informações da Internet) versão 5.0 ou posterior com o suporte do ASP habilitado. O banco de dados de exemplo AdventureWorks também deve ser instalado.

  2. Copie o exemplo de código anterior e cole-o no XML ou editor de texto que você usa. Salve o arquivo como RetrieveResults.asp no diretório raiz que o IIS usa. Normalmente, esse diretório é C:Inetpub\wwwroot.

  3. Abra a página ASP em uma janela do navegador usando a seguinte URL. Primeiro, substitua “MyServer” por “localhost” ou pelo nome real do servidor onde o SQL Server e o IIS estão instalados.

    https://MyServer/RetrieveResults.asp
    

Os resultados apresentados da página HTML gerada serão semelhantes à seguinte saída de exemplo:

Processamento no lado do servidor

Page Generated @ 3/11/2006 3:36:02 PM

Connect String = Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=AdventureWorks;Integrated Security=SSPI;

ADO Version = 2.8

adoConn.State = 1

Query String = SELECT Demographics from Sales.Store WHERE CustomerID = 3 FOR XML AUTO

Pushing XML to client for processing

Processamento do lado do cliente do documento XML MyDataIsle

  • AnnualSales: 1500000

  • AnnualRevenue: 150000

  • BankName: Primário Internacional

  • BusinessType: SISTEMA OPERACIONAL

  • YearOpened: 1974

  • Especialidade: Rodovia

  • SquareFeet: 38000

  • Marcas: 3

  • Internet: DSL

  • NumberEmployees: 40

Em seguida, a caixa de mensagem do VBScript exibirá o seguinte conteúdo das ilhas de dados XML originais, não filtradas, que foram retornadas pelos resultados da consulta FOR XML.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Sales.Store>
    <Demographics>
      <StoreSurvey xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey">
        <AnnualSales>1500000</AnnualSales>
        <AnnualRevenue>150000</AnnualRevenue>
        <BankName>Primary International</BankName>
        <BusinessType>OS</BusinessType>
        <YearOpened>1974</YearOpened>
        <Specialty>Road</Specialty>
        <SquareFeet>38000</SquareFeet>
        <Brands>3</Brands>
        <Internet>DSL</Internet>
        <NumberEmployees>40</NumberEmployees>
      </StoreSurvey>
    </Demographics>
  </Sales.Store>
</ROOT>

Recuperar dados FOR XML com o ASP.NET e o .NET Framework

Como no exemplo anterior, o código ASP.NET a seguir mostra os resultados da consulta de uma coluna de tipo de dados xml , Demographics, na Sales.Store tabela do banco de dados de exemplo AdventureWorks. Como no exemplo anterior, a consulta procura o valor da instância dessa coluna para a linha em que o CustomerID é igual a 3.

Neste exemplo, as seguintes APIs gerenciadas pelo Microsoft .NET Framework retornam e renderizam os resultados da consulta FOR XML:

  1. O SqlConnection abre uma conexão com o SQL Server, com base no conteúdo de uma variável strConnde cadeia de conexão especificada.

  2. SqlDataAdapter serve como o adaptador de dados e usa a conexão SQL e uma cadeia de caracteres de consulta SQL especificada para executar a consulta FOR XML.

  3. Após a execução da consulta, o método SqlDataAdapter.Fill preenche uma instância do DataSet , MyDataSetcom a saída da consulta FOR XML.

  4. O método DataSet.GetXml retorna os resultados da consulta como uma cadeia de caracteres que a página HTML gerada pelo servidor exibe.

    <%@ Page Language="VB" %>
    <HTML>
    <HEAD>
    <TITLE>FOR XML Query Example</TITLE>
    <STYLE>
       BODY
       {
          FONT-FAMILY: Tahoma;
          FONT-SIZE: 8pt;
          OVERFLOW: auto
       }
       H3
       {
          FONT-FAMILY: Tahoma;
          FONT-SIZE: 8pt;
          OVERFLOW: auto
       }
    </STYLE>
    </HEAD>
    <BODY>
    <%
    Dim s as String
    s = "<H3>Server-side processing</H3>" & _
        "Page Generated @ " & Now() & "<BR/>"
    
    Dim SQL As String
    SQL = "SELECT Demographics from Sales.Store WHERE CustomerID = 3 FOR XML AUTO"
    
    Dim strConn As String
    strConn = "Server=(local);Database=AdventureWorks;Integrated Security=SSPI;"
    
    Dim MySqlConn As New Microsoft.Data.SqlClient.SqlConnection(strConn)
    Dim MySqlAdapter As New Microsoft.Data.SqlClient.SqlDataAdapter(SQL,MySqlConn)
    Dim MyDataSet As New System.Data.DataSet
    
    MySqlConn.Open()
    s = s & "<P>SqlConnection opened.</P>"
    
    MySqlAdapter.Fill(MyDataSet)
    s = s & "<P>" & MyDataSet.GetXml  & "</P>"
    
    MySqlConn.Close()
    s = s & "<P>SqlConnection closed.</P>"
    
    Message.InnerHtml=s
    %>
    <SPAN id="Message" runat=server />
    </BODY>
    </HTML>
    

Testar este exemplo

  1. Verifique se o IIS e o banco de dados de exemplo AdventureWorks para SQL Server estão instalados.

    Este exemplo requer o IIS (Serviços de Informações da Internet) versão 5.0 ou posterior com ASP.NET suporte habilitado. O banco de dados de exemplo AdventureWorks também deve ser instalado.

  2. Copie o código anterior e cole-o no XML ou editor de texto que você usa. Salve o arquivo como RetrieveResults.aspx no diretório raiz que o IIS usa. Normalmente, esse diretório é C:Inetpub\wwwroot.

  3. Abra a página ASP.NET em uma janela do navegador usando a URL a seguir. Primeiro, substitua “MyServer” por “localhost” ou pelo nome real do servidor onde o SQL Server e o IIS estão instalados.

    https://MyServer/RetrieveResults.aspx
    

Os resultados apresentados da página HTML gerada serão semelhantes à seguinte saída de exemplo:

Processamento no lado do servidor

Page Generated @ 3/11/2006 3:36:02 PM

SqlConnection opened.

<Sales.Store><Demographics><StoreSurvey xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey"><AnnualSales>1500000</AnnualSales><AnnualRevenue>150000</AnnualRevenue><BankName>Primary International</BankName><BusinessType>OS</BusinessType><YearOpened>1974</YearOpened><Specialty>Road</Specialty><SquareFeet>38000</SquareFeet><Brands>3</Brands><Internet>DSL</Internet><NumberEmployees>40</NumberEmployees></StoreSurvey></Demographics></Sales.Store>

SqlConnection closed.

Observação

O suporte ao tipo de dados xml do SQL Server permite solicitar que uma consulta FOR XML retorne resultados como tipo de dados xml , em vez de como dados digitado por cadeia de caracteres ou imagem, especificando a diretiva TYPE. Quando você usa a diretiva TYPE em consultas FOR XML, ela fornece acesso programático aos resultados FOR XML semelhantes à abordagem mostrada em Usar Dados XML em Aplicativos.