在应用程序代码中使用 FOR XML 结果

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 数据库

通过将 FOR XML 子句与 SQL 查询结合使用,可以将查询结果检索出来,然后转换为 XML 数据。 在 XML 应用程序代码中使用 FOR XML 查询结果时,可以:

本文提供了演示这些方法的示例。

使用 ADO 和 XML 数据岛检索 FOR XML 数据

使用 FOR XML 查询时,支持 COM IStream 接口的 ADO Stream 对象或其他对象(如 Active Server Pages(ASP) 请求响应对象)可以包含结果。

例如,以下 ASP 代码显示在 AdventureWorks 示例数据库的 表中查询 Sales.Store 数据类型列 Demographics 的结果。 确切地说,该查询在 CustomerID 等于 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 -->

此示例 ASP 页包含使用 ADO 执行 FOR XML 查询并在 XML 数据岛 (MyDataIsle) 中返回 XML 结果的服务器端 VBScript。 然后,浏览器会收到此 XML 数据岛,以便进行其他客户端处理。 然后,其他客户端 VBScript 代码处理 XML 数据岛的内容,将内容显示为生成的 DHTML 的一部分,并打开消息框以显示 XML 数据岛预处理的内容。

测试此示例

  1. 验证是否已安装 IIS 和适用于 SQL Server 的 AdventureWorks 示例数据库。

    此示例要求使用 Internet Information Services 版本 5.0 或更高版本,并启用 ASP 支持。 还必须安装 AdventureWorks 示例数据库。

  2. 复制上述代码示例并将其粘贴到使用的 XML 或文本编辑器中。 请将文件另存为“RetrieveResults.asp”,放入 IIS 使用的根目录中。 通常,此目录为 C:Inetpub\wwwroot。

  3. 使用以下 URL 在浏览器窗口中打开 ASP 页。 首先,将“MyServer”替换为“localhost”或安装了 SQL Server 和 IIS 的服务器的实际名称。

    https://MyServer/RetrieveResults.asp
    

您所看到的生成的 HTML 页结果与以下示例输出类似:

服务器端处理

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

XML 文档 MyDataIsle 的客户端处理

  • AnnualSales: 1500000

  • AnnualRevenue: 150000

  • BankName: Primary International

  • 业务类型: OS

  • YearOpened: 1974

  • Specialty: 道路

  • SquareFeet: 38000

  • Brands: 3

  • Internet: DSL

  • NumberEmployees: 40

然后,VBScript 消息框将显示以下由 FOR XML 查询结果返回的原始、未筛选的 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>

使用 ASP.NET 和 .NET Framework 检索 FOR XML 数据

与前面的示例一样,以下 ASP.NET 代码显示了在 AdventureWorks 示例数据库中查询 xml 数据类型列“人口统计 Sales.Store ”的结果。 同样与上一个示例相似,该查询在 CustomerID 等于 3 的行中查找此列的实例值。

在此示例中,以下Microsoft .NET Framework 托管 API 返回并呈现 FOR XML 查询结果:

  1. SqlConnection 根据指定的连接字符串变量 strConn的内容打开与 SQL Server 的连接。

  2. SqlDataAdapter 充当数据适配器,并使用 SQL 连接和指定的 SQL 查询字符串来执行 FOR XML 查询。

  3. 执行查询后, SqlDataAdapter.Fill 方法使用 FOR XML 查询的输出填充 数据集 实例 MyDataSet

  4. DataSet.GetXml 方法将查询结果作为服务器生成的 HTML 页显示的字符串返回。

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

测试此示例

  1. 验证是否已安装 IIS 和适用于 SQL Server 的 AdventureWorks 示例数据库。

    此示例需要启用了 ASP.NET 支持的 Internet Information Services 5.0 或更高版本。 还必须安装 AdventureWorks 示例数据库。

  2. 复制上述代码并将其粘贴到使用的 XML 或文本编辑器中。 将文件另存为 IIS 使用的根目录中RetrieveResults.aspx。 通常,此目录为 C:Inetpub\wwwroot。

  3. 使用以下 URL 在浏览器窗口中打开 ASP.NET 页。 首先,将“MyServer”替换为“localhost”或安装了 SQL Server 和 IIS 的服务器的实际名称。

    https://MyServer/RetrieveResults.aspx
    

您所看到的生成的 HTML 页结果与以下示例输出类似:

服务器端处理

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.

注意

通过 SQL Server xml 数据类型支持,可以请求 FOR XML 查询通过指定 TYPE 指令将结果作为 xml 数据类型(而不是字符串或图像类型化数据)返回。 在 FOR XML 查询中使用 TYPE 指令时,它提供对 FOR XML 结果的编程访问,类似于 在应用程序中使用 XML 数据中所示的方法。