Verwenden von FOR XML-Ergebnissen in Anwendungscode

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Datenbank in Microsoft Fabric

Mithilfe von FOR XML-Klauseln mit SQL-Abfragen können Sie Abfrageergebnisse als XML-Daten abrufen und umwandeln. Wenn Sie FOR XML-Abfrageergebnisse in XML-Anwendungscode verwenden, können Sie:

Dieser Artikel enthält Beispiele und veranschaulicht diese Vorgehensweisen.

Abruf von FOR XML-Daten mit ADO und XML-Dateninseln

Das ADO Stream-Objekt oder andere Objekte, die die COM-IStream-Schnittstelle unterstützen, z. B. die ASP-Anforderungs - und Antwortobjekte , können die Ergebnisse enthalten, wenn Sie mit FOR XML-Abfragen arbeiten.

Der folgende ASP-Code zeigt z. B. die Ergebnisse der Abfrage der xml-Datentypspalte Demographics in der Sales.Store-Tabelle der AdventureWorks-Beispieldatenbank. Insbesondere sucht die Abfrage nach dem Instanzwert dieser Spalte für die Zeile, in der die CustomerID gleich 3 ist.

<!-- 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 -->

Diese ASP-Beispielseite enthält serverseitiges VBScript, das ADO zum Ausführen der FOR XML-Abfrage und zum Zurückgeben der XML-Ergebnisse in einer XML-Dateninsel (MyDataIsle) verwendet. Der Browser empfängt dann diese XML-Dateninsel für zusätzliche clientseitige Verarbeitung. Zusätzlicher clientseitiger VBScript-Code verarbeitet dann den Inhalt der XML-Dateninsel, zeigt den Inhalt als Teil des resultierenden DHTML an und öffnet ein Meldungsfeld, um den vorverarbeiteten Inhalt der XML-Dateninsel anzuzeigen.

Testen Sie dieses Beispiel

  1. Stellen Sie sicher, dass IIS und die AdventureWorks-Beispieldatenbank für SQL Server installiert sind.

    In diesem Beispiel sind Internetinformationsdienste (IIS) Version 5.0 oder höher mit aktivierter ASP-Unterstützung erforderlich. Die AdventureWorks-Beispieldatenbank muss ebenfalls installiert werden.

  2. Kopieren Sie das vorangehende Codebeispiel, und fügen Sie es in den von Ihnen verwendeten XML- oder Text-Editor ein. Speichern Sie die Datei als RetrieveResults.asp im von IIS verwendeten Stammverzeichnis. In der Regel ist dieses Verzeichnis C:Inetpub\wwwroot.

  3. Öffnen Sie die ASP-Seite in einem Browserfenster, indem Sie die folgende URL verwenden. Ersetzen Sie zunächst 'MyServer' entweder durch "localhost" oder durch den tatsächlichen Namen des Servers, auf dem SQL Server und IIS installiert sind.

    https://MyServer/RetrieveResults.asp
    

Die generierten HTML-Seitenergebnisse, die angezeigt werden, ähneln der folgenden Beispielausgabe:

Serverseitiges Verarbeiten

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

Clientseitiges Verarbeiten von XML-Dokument MyDataIsle

  • AnnualSales: 1500000

  • AnnualRevenue: 150000

  • BankName: Primär international

  • BusinessType: OS

  • YearOpened: 1974

  • Bereich: Straßenbau

  • SquareFeet: 38000

  • Marken: 3

  • Internet: DSL

  • NumberEmployees: 40

Das VBScript-Meldungsfeld zeigt dann den folgenden ursprünglichen, ungefilterten Inhalt der XML-Dateninsel, der durch die Ergebnisse der FOR XML-Abfrage zurückgegeben wurde.

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

Abrufen der FOR XML-Daten mit ASP.NET und .NET Framework

Wie im vorherigen Beispiel zeigt der folgende ASP.NET Code die Ergebnisse der Abfrage einer XML-Datentypspalte , Demografie, in der Sales.Store Tabelle der AdventureWorks-Beispieldatenbank. Und wie im vorherigen Beispiel sucht die Abfrage nach dem Instanzwert dieser Spalte für die Zeile, in der die CustomerID gleich 3 ist.

In diesem Beispiel geben die folgenden von Microsoft .NET Framework verwalteten APIs die FOR XML-Abfrageergebnisse zurück und rendern sie:

  1. SqlConnection öffnet eine Verbindung mit SQL Server, basierend auf dem Inhalt einer angegebenen Verbindungszeichenfolgenvariable, strConn.

  2. SqlDataAdapter dient als Datenadapter und verwendet die SQL-Verbindung und eine angegebene SQL-Abfragezeichenfolge, um die FOR XML-Abfrage auszuführen.

  3. Nach der Ausführung der Anfrage füllt die SqlDataAdapter.Fill-Methode eine Instanz von DataSet mit der Ausgabe der FOR XML-Abfrage MyDataSet aus.

  4. Die DataSet.GetXml-Methode gibt die Abfrageergebnisse als Zeichenfolge zurück, die von der servergenerierten HTML-Seite angezeigt wird.

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

Testen Sie dieses Beispiel

  1. Stellen Sie sicher, dass IIS und die AdventureWorks-Beispieldatenbank für SQL Server installiert sind.

    In diesem Beispiel sind Internetinformationsdienste (IIS) Version 5.0 oder höher erforderlich, wobei ASP.NET Unterstützung aktiviert ist. Die AdventureWorks-Beispieldatenbank muss ebenfalls installiert werden.

  2. Kopieren Sie den vorherigen Code, und fügen Sie ihn in den von Ihnen verwendeten XML- oder Text-Editor ein. Speichern Sie die Datei als RetrieveResults.aspx im von IIS verwendeten Stammverzeichnis. In der Regel ist dieses Verzeichnis C:Inetpub\wwwroot.

  3. Öffnen Sie die ASP.NET Seite in einem Browserfenster mithilfe der folgenden URL. Ersetzen Sie zunächst 'MyServer' entweder durch "localhost" oder durch den tatsächlichen Namen des Servers, auf dem SQL Server und IIS installiert sind.

    https://MyServer/RetrieveResults.aspx
    

Die generierten HTML-Seitenergebnisse, die angezeigt werden, ähneln der folgenden Beispielausgabe:

Serverseitiges Verarbeiten

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.

Hinweis

Mit der SQL Server-XML-Datentypunterstützung können Sie anfordern, dass eine FOR XML-Abfrage Ergebnisse als XML-Datentyp zurückgibt, anstatt als Zeichenfolgen- oder Bildtypdaten, indem Sie die TYPE-Direktive angeben. Wenn Sie die TYPE-Direktive in FOR XML-Abfragen verwenden, bietet sie programmgesteuerten Zugriff auf die FOR XML-Ergebnisse, ähnlich wie bei verwendung von XML-Daten in Anwendungen.