Utilizzare i risultati di query FOR XML nel codice di un'applicazioneUse FOR XML Results in Application Code

L'utilizzo delle clausole FOR XML nelle query SQL consente di recuperare e inoltre di eseguire il cast dei risultati delle query come dati XML.By using FOR XML clauses with SQL queries, you can retrieve and even cast query results as XML data. Se i risultati di una query FOR XML possono essere utilizzati nel codice XML dell'applicazione, è possibile eseguire le operazioni seguenti:This functionality allows you to do the following when FOR XML query results can be used in XML application code:

  • Eseguire query nelle tabelle SQL per le istanze di valori di Dati XML (SQL Server)Query SQL tables for instances of XML Data (SQL Server) values

  • Applicare la Direttiva TYPE in query FOR XML per restituire il risultato di query che contengono dati di testo o di tipo image in formato XML.Apply the TYPE Directive in FOR XML Queries to return the result of queries that contain text or image typed data as XML

    In questo argomento vengono forniti esempi di questi approcci.This topic provides examples that demonstrate these approaches.

Recupero dei dati di query FOR XML con ADO e isole di dati XMLRetrieving FOR XML Data with ADO and XML Data Islands

L'oggetto ADO Stream o altri oggetti che supportano l'interfaccia COM IStream , ad esempio gli oggetti ASP (Active Server Pages) Request e Response possono essere usati per includere i risultati quando si eseguono query FOR XML.The ADO Stream object or other objects that support the COM IStream interface, such as the Active Server Pages (ASP) Request and Response objects, can be used to contain the results when you are working with FOR XML queries.

Ad esempio, il codice ASP seguente mostra i risultati di una query eseguita sulla colonna con tipo di dati xml Demographics della tabella Sales.Store del database di esempio AdventureWorks.For example, the following ASP code shows the results of querying an xml data type column, Demographics, in the Sales.Store table of the AdventureWorks sample database. La query cerca specificatamente il valore dell'istanza della colonna relativo alla riga in cui CustomerID è uguale a 3.Specifically, the query looks for the instance value of this column for the row where the CustomerID is equal to 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 -->  

Questa pagina ASP di esempio contiene codice VBScript sul lato server che utilizza ADO per eseguire la query FOR XML e restituire i risultati XML in un'isola di dati XML, MyDataIsle.This example ASP page contains server-side VBScript that uses ADO to execute the FOR XML query and return the XML results in an XML data island, MyDataIsle. L'isola di dati XML viene quindi restituita nel browser per un'ulteriore elaborazione sul lato client,This XML data island is then returned in the browser for additional client-side processing. durante la quale viene utilizzato codice VBScript aggiuntivo per elaborare il contenuto dell'isola di dati XML.Additional client-side VBScript code is then used to process the contents of the XML data island. Il processo viene eseguito prima di visualizzare il contenuto come parte del DHTML risultante e di aprire una finestra di messaggio in cui è visualizzato il contenuto pre-elaborato dell'isola di dati XML.This process is performed before displaying the contents as part of the resultant DHTML and opening a message box to show the preprocessed contents of the XML data island.

Per testare l'esempioTo test this example

  1. Verificare che IIS e il database di esempio AdventureWorks per SQL ServerSQL Server siano installati.Verify that IIS is installed and that the AdventureWorks sample database for SQL ServerSQL Server has been installed.

    Per eseguire l'esempio, è necessario che sia installato Internet Information Services (IIS) 5.0 o versioni successive e che sia attivato il supporto ASP.This example requires that Internet Information Services (IIS) version 5.0, or later versions, are installed with ASP support enabled. È inoltre necessario installare il database di esempio AdventureWorks.Also, the AdventureWorks sample database has to be installed.

  2. Copiare il codice di esempio fornito in precedenza e incollarlo nell'editor XML o di testo in uso.Copy the code example that was previously provided and paste it into the XML or text editor that you use. Salvare il file come RetrieveResults.asp nella directory radice utilizzata per IIS,Save the file as RetrieveResults.asp in the root directory that is used for IIS. che in genere è C:Inetpub\wwwroot.Typically, this is C:Inetpub\wwwroot.

  3. Aprire la pagina ASP in una finestra del browser specificando l'URL seguente.Open the ASP page in a browser window by using the following URL. Sostituire innanzitutto 'MyServer' con "localhost" o con il nome effettivo del server in cui sono installati SQL ServerSQL Server e IIS.First, replace 'MyServer' with either "localhost" or the actual name of the server where SQL ServerSQL Server and IIS are installed.

    http://MyServer/RetrieveResults.asp  
    

    I risultati visualizzati per la pagina HTML creata saranno simili all'output di esempio seguente:The generated HTML page results that appear will be similar to the following sample output:

Elaborazione sul lato serverServer-side processing

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

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

ADO Version = 2.8ADO Version = 2.8

adoConn.State = 1adoConn.State = 1

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

Pushing XML to client for processingPushing XML to client for processing

Elaborazione sul lato client del documento XML MyDataIsleClient-side processing of XML Document MyDataIsle
  • AnnualSales: 1500000AnnualSales: 1500000

  • AnnualRevenue: 150000AnnualRevenue: 150000

  • BankName: Primary InternationalBankName: Primary International

  • BusinessType: OSBusinessType: OS

  • YearOpened: 1974YearOpened: 1974

  • Specialty: RoadSpecialty: Road

  • SquareFeet: 38000SquareFeet: 38000

  • Brands: 3Brands: 3

  • Internet: DSLInternet: DSL

  • NumberEmployees: 40NumberEmployees: 40

    Nella finestra di messaggio VBScript verrà visualizzato il contenuto originale non filtrato dell'isola di dati XML seguente, restituito dai risultati della query FOR XML.The VBScript message box will then show the following original, unfiltered XML data island contents that were returned by the FOR XML query results.

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

Recupero dei dati di query FOR XML con ASP.NET e .NET FrameworkRetrieving FOR XML Data with ASP.NET and the .NET Framework

Come nell'esempio precedente, il codice ASP.NET seguente mostra i risultati di una query eseguita sulla colonna con tipo di dati xml Demographics della tabella Sales.Store del database di esempio AdventureWorks.As in the previous example, the following ASP.NET code shows the results of querying an xml data type column, Demographics, in the Sales.Store table of the AdventureWorks sample database. Come nell'esempio precedente, la query cerca il valore dell'istanza della colonna relativo alla riga in cui CustomerID è uguale a 3.As in the previous example, the query looks for the instance value of this column for the row where the CustomerID is equal to 3.

Nell'esempio, per la restituzione e il rendering dei risultati della query FOR XML vengono utilizzate le API gestite di Microsoft .NET Framework seguenti:In this example, the following Microsoft .NET Framework managed APIs are used to accomplish the return and rendering of the FOR XML query results:

  1. SqlConnection consente di stabilire una connessione a SQL Server, basata sul contenuto di una variabile stringa di connessione specificata, strConn.SqlConnection is used to open a connection to SQL Server, based on the contents of a specified connection string variable, strConn.

  2. SqlDataAdapter funge quindi da adattatore dati e consente di eseguire la query FOR XML usando la connessione SQL e una stringa di query SQL specificata.SqlDataAdapter is then used as the data adapter and it uses the SQL connection and a specified SQL query string to execute the FOR XML query.

  3. Dopo avere eseguito la query, viene chiamato il metodo SqlDataAdapter.Fill , che viene quindi passato a un'istanza di un DataSet MyDataSet per riempire il set di dati con l'output della query FOR XML.After the query has executed, the SqlDataAdapter.Fill method is then called and passed an instance of a DataSet, MyDataSet, in order to fill the data set with the output of the FOR XML query.

  4. Viene quindi chiamato il metodo DataSet.GetXml per restituire i risultati della query come una stringa visualizzabile nella pagina HTML generata dal server.The DataSet.GetXml method is then called to return the query results as a string that can be displayed in the server-generated HTML page.

    <%@ 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 System.Data.SqlClient.SqlConnection(strConn)  
    Dim MySqlAdapter As New System.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>  
    

Per testare l'esempioTo test this example

  1. Verificare che IIS e il database di esempio AdventureWorks per SQL ServerSQL Server siano installati.Verify that IIS is installed and that the AdventureWorks sample database for SQL ServerSQL Server has been installed.

    Per eseguire l'esempio, è necessario che sia installato Internet Information Services (IIS) 5.0 o versioni successive e che sia attivato il supporto ASP.NET.This example requires that Internet Information Services (IIS) version 5.0, or later versions, are installed with ASP.NET support enabled. È inoltre necessario installare il database di esempio AdventureWorks.Also, the AdventureWorks sample database has to be installed.

  2. Copiare il codice fornito in precedenza e incollarlo nell'editor XML o di testo in uso.Copy the code that was previously provided and paste it into the XML or text editor that you use. Salvare il file come RetrieveResults.aspx nella directory radice utilizzata per IIS,Save the file as RetrieveResults.aspx in the root directory used for IIS. che in genere è C:Inetpub\wwwroot.Typically, this is C:Inetpub\wwwroot.

  3. Aprire la pagina ASP.NET in una finestra del browser specificando l'URL seguente.Open the ASP.NET page in a browser window using the following URL. Sostituire innanzitutto 'MyServer' con "localhost" o con il nome effettivo del server in cui sono installati SQL ServerSQL Server e IIS.First, replace 'MyServer' with either "localhost" or the actual name of the server where SQL ServerSQL Server and IIS are installed.

    http://MyServer/RetrieveResults.aspx  
    

    I risultati visualizzati per la pagina HTML creata saranno simili all'output di esempio seguente:The generated HTML page results that appear will be similar to the following sample output:

Elaborazione sul lato serverServer-side processing
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.  
Nota

Il supporto del tipo di dati xml in SQL ServerSQL Server consente di richiedere che il risultato di una query FOR XML venga restituito come tipo di dati xml invece che come dati tipizzati di stringa o immagine, specificando la direttiva TYPE.The SQL ServerSQL Serverxml data type support lets you request that the result of a FOR XML query be returned as xml data type, instead of as string or image typed data, by specifying the TYPE directive. L'uso della direttiva TYPE nelle query FOR XML consente di ottenere l'accesso a livello di programmazione ai risultati FOR XML, in modo analogo a quanto illustrato in Utilizzo di dati XML nelle applicazioni.When the TYPE directive is used in FOR XML queries, it provides programmatic access to the FOR XML results similar to that shown in Use XML Data in Applications.

Vedere ancheSee Also

FOR XML (SQL Server)FOR XML (SQL Server)