适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
通过将 FOR XML 子句与 SQL 查询结合使用,可以将查询结果检索出来,然后转换为 XML 数据。 在 XML 应用程序代码中使用 FOR XML 查询结果时,可以:
查询 SQL 表中 XML 数据 (SQL Server) 值的实例
应用 TYPE Directive in FOR XML Queries 以将包含文本或图像类型化数据的查询的结果返回为 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 数据岛预处理的内容。
测试此示例
验证是否已安装 IIS 和适用于 SQL Server 的 AdventureWorks 示例数据库。
此示例要求使用 Internet Information Services 版本 5.0 或更高版本,并启用 ASP 支持。 还必须安装 AdventureWorks 示例数据库。
复制上述代码示例并将其粘贴到使用的 XML 或文本编辑器中。 请将文件另存为“RetrieveResults.asp”,放入 IIS 使用的根目录中。 通常,此目录为 C:Inetpub\wwwroot。
使用以下 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 查询结果:
SqlConnection 根据指定的连接字符串变量
strConn的内容打开与 SQL Server 的连接。SqlDataAdapter 充当数据适配器,并使用 SQL 连接和指定的 SQL 查询字符串来执行 FOR XML 查询。
执行查询后, SqlDataAdapter.Fill 方法使用 FOR XML 查询的输出填充 数据集 实例
MyDataSet。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>
测试此示例
验证是否已安装 IIS 和适用于 SQL Server 的 AdventureWorks 示例数据库。
此示例需要启用了 ASP.NET 支持的 Internet Information Services 5.0 或更高版本。 还必须安装 AdventureWorks 示例数据库。
复制上述代码并将其粘贴到使用的 XML 或文本编辑器中。 将文件另存为 IIS 使用的根目录中RetrieveResults.aspx。 通常,此目录为 C:Inetpub\wwwroot。
使用以下 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 数据中所示的方法。