Utiliser des résultats FOR XML dans le code de l’application

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de données SQL dans Microsoft Fabric

En utilisant des clauses FOR XML avec des requêtes SQL, vous pouvez récupérer et convertir les résultats des requêtes en tant que données XML. Lorsque vous utilisez des résultats de requête FOR XML dans le code d’application XML, vous pouvez :

Cet article donne des exemples expliquant ces approches.

Récupération des données FOR XML avec des îlots de données ADO et XML

L’objet Ado Stream ou d’autres objets qui prennent en charge l’interface COM IStream , comme les objets de requête et de réponse Active Server Pages (ASP), peuvent contenir les résultats lorsque vous utilisez des requêtes FOR XML.

Le code ASP suivant, par exemple, montre les résultats d'une requête lancée sur la colonne de type xml Demographics de la table Sales.Store de la base de données AdventureWorks. La requête recherche plus particulièrement la valeur d'instance de cette colonne pour la ligne où CustomerID est égal à 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 -->

Cet exemple de page ASP contient le code VBScript côté serveur qui utilise ADO pour exécuter la requête FOR XML et renvoyer les résultats XML dans l'îlot de données XML MyDataIsle. Le navigateur reçoit ensuite cet îlot de données XML pour un traitement côté client supplémentaire. Un code VBScript côté client supplémentaire traite ensuite le contenu de l’île de données XML, affichant le contenu dans le cadre du DHTML résultant et ouvrant une boîte de message pour afficher le contenu prétraité de l’île de données XML.

Testez cet exemple

  1. Vérifiez que IIS et l’exemple de base de données AdventureWorks pour SQL Server sont installés.

    Cet exemple nécessite Internet Information Services (IIS) version 5.0 ou ultérieure avec la prise en charge d’ASP activée. L’exemple de base de données AdventureWorks doit également être installé.

  2. Copiez l’exemple de code précédent et collez-le dans l’éditeur de texte ou XML que vous utilisez. Enregistrez le fichier en tant que RetrieveResults.asp dans le répertoire racine utilisé par IIS. En règle générale, ce répertoire est C :Inetpub\wwwroot.

  3. Ouvrez la page ASP dans une fenêtre du navigateur en utilisant l'URL qui suit. Premièrement, remplacez « MyServer » par « localhost » ou par le nom réel du serveur sur lequel résident SQL Server et les services Internet (IIS).

    https://MyServer/RetrieveResults.asp
    

La page HTML générée qui en résulte et qui apparaît ressemblera à l'exemple de sortie suivant :

Traitement côté serveur

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

Traitement côté client du document XML MyDataIsle

  • AnnualSales : 15000000

  • AnnualRevenue : 150000

  • BankName : Primary International

  • BusinessType : OS

  • YearOpened : 1974

  • Spécialité: Route

  • SquareFeet : 38000

  • Marques : 3

  • Internet: DSL

  • NumberEmployees : 40

La boîte de message VBScript affichera ensuite le contenu original et non filtré de l'îlot de données XML qui a été renvoyé par les résultats de la requête 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>

Récupération des données FOR XML avec ASP.NET et .NET Framework

Comme dans l’exemple précédent, le code ASP.NET suivant montre les résultats de l’interrogation d’une colonne de type de données xml , Données démographiques, dans la table de l’exemple Sales.Store de base de données AdventureWorks. Comme dans l'exemple précédent, la requête recherche plus particulièrement la valeur d'instance de cette colonne pour la ligne où CustomerID est égal à 3.

Dans cet exemple, les API gérées par Microsoft .NET Framework suivantes retournent et affichent les résultats de la requête FOR XML :

  1. SqlConnection ouvre une connexion à SQL Server, en fonction du contenu d’une variable de chaîne de connexion spécifiée. strConn

  2. SqlDataAdapter sert d’adaptateur de données et utilise la connexion SQL et une chaîne de requête SQL spécifiée pour exécuter la requête FOR XML.

  3. Une fois la requête exécutée, la méthode SqlDataAdapter.Fill remplit une instance DataSet , MyDataSetavec la sortie de la requête FOR XML.

  4. La méthode DataSet.GetXml retourne les résultats de la requête sous forme de chaîne affichée par la page HTML générée par le serveur.

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

Testez cet exemple

  1. Vérifiez que IIS et l’exemple de base de données AdventureWorks pour SQL Server sont installés.

    Cet exemple nécessite Internet Information Services (IIS) version 5.0 ou ultérieure avec la prise en charge de ASP.NET. L’exemple de base de données AdventureWorks doit également être installé.

  2. Copiez le code précédent et collez-le dans l’éditeur xml ou texte que vous utilisez. Enregistrez le fichier en tant que RetrieveResults.aspx dans le répertoire racine utilisé par IIS. En règle générale, ce répertoire est C :Inetpub\wwwroot.

  3. Ouvrez la page ASP.NET dans une fenêtre de navigateur à l’aide de l’URL suivante. Premièrement, remplacez « MyServer » par « localhost » ou par le nom réel du serveur sur lequel résident SQL Server et les services Internet (IIS).

    https://MyServer/RetrieveResults.aspx
    

La page HTML générée qui en résulte et qui apparaît ressemblera à l'exemple de sortie suivant :

Traitement côté serveur

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.

Remarque

La prise en charge du type de données XML SQL Server vous permet de demander qu’une requête FOR XML retourne des résultats en tant que type de données XML , au lieu de chaîne ou de données typées d’images, en spécifiant la directive TYPE. Lorsque vous utilisez la directive TYPE dans les requêtes FOR XML, elle fournit un accès programmatique aux résultats FOR XML similaires à l’approche indiquée dans Utiliser des données XML dans les applications.