次の方法で共有


アプリケーション コードでの FOR XML の結果の使用

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL データベース

SQL クエリで FOR XML 句を使用することにより、クエリの結果を XML データで取得したり、XML データにキャストすることができます。 この機能により、FOR XML のクエリの結果を XML アプリケーション コードで使用するときに、次のことが可能になります。

このトピックでは、これらの方法を示す例を提供します。

ADO と XML データ アイランドによる、FOR XML データの取得

FOR XML クエリで作業を行っているときに、ADO Stream オブジェクト、または ASP (Active Server Page) Request オブジェクトや Response オブジェクトなどの、COM IStream インターフェイスをサポートする他のオブジェクトを使用して、結果を含めることができます。

たとえば、次の ASP コードは、AdventureWorks サンプル データベースの Sales.Store テーブルにある、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 サンプル データベースがインストールされていることを確認します。

    この例では、IIS (インターネット インフォメーション サービス) Version 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: プライマリ インターナショナル

  • ビジネスタイプ: オペレーティング・システム (OS)

  • YearOpened: 1974

  • 専門: 道路

  • SquareFeet: 38000

  • ブランド: 3

  • インターネット: DSL

  • NumberEmployees: 40

次に、VBScript メッセージ ボックスに、元のフィルター処理されていない XML データ アイランドのコンテンツが次のように表示されます。これは、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>

ASP.NET と .NET Framework を使用した、FOR XML データの取得

前述の例と同様に、次の ASP.NET コードは、AdventureWorks サンプル データベースの Sales.Store テーブルにある、 xml データ型の列である Demographics のクエリ結果を示しています。 前述の例と同様に、クエリは CustomerID が 3 の行で、この列のインスタンス値を検索します。

この例では、FOR XML のクエリ結果を返して表示するために、次の Microsoft .NET Framework マネージド API が使用されています。

  1. 指定した接続文字列変数 strConn の内容に基づいて SQL Server への接続を開くために、SqlConnection が使用されます。

  2. 次に、データ アダプターとしてSqlDataAdapter が使用されます。また、FOR XML クエリを実行するために、SQL 接続および指定した SQL クエリ文字列を使用します。

  3. クエリの実行後、 SqlDataAdapter.Fill メソッドが呼び出され、FOR XML クエリの出力をデータセットに設定するために、 DataSet のインスタンスである MyDataSet が渡されます。

  4. その後、サーバーで生成される HTML ページに表示可能な文字列としてクエリ結果を返すために、 DataSet.GetXml メソッドが呼び出されます。

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

この例をテストする

  1. IIS がインストールされ、SQL Server の AdventureWorks サンプル データベースがインストールされていることを確認します。

    この例では、IIS (インターネット インフォメーション サービス) Version 5.0 以降がインストールされていて、ASP.NET のサポートが有効になっている必要があります。 また、AdventureWorks サンプル データベースがインストールされている必要があります。

  2. 前述のコードをコピーし、XML エディターまたはテキスト エディターに貼り付けます。 ファイルに RetrieveResults.aspx という名前を付けて、IIS で使用されているルート ディレクトリに保存します。 通常、ルート ディレクトリは 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.

Note

SQL Server による xml データ型のサポートにより、TYPE ディレクティブを指定することで、FOR XML クエリの結果を、string データ型または image データ型ではなく、xml データ型で返すように要求できます。 FOR XML クエリに TYPE ディレクティブを使用すると、「 アプリケーションでの XML データの使用」で示したのと同様に、プログラムから FOR XML の結果にアクセスできます。

関連項目