애플리케이션 코드에서 FOR XML 결과 사용

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

SQL 쿼리에서 FOR XML 절을 사용하면 쿼리 결과 검색은 물론 XML 데이터로 캐스팅할 수도 있습니다. 이 기능을 사용하면 FOR XML 쿼리 결과를 XML 애플리케이션 코드에서 사용할 수 있는 경우 다음을 수행할 수 있습니다.

이 문서에서는 이러한 방법을 보여 주는 예제를 제공합니다.

ADO 및 XML 데이터 아일랜드를 사용하여 FOR XML 데이터 검색

ADO Stream 개체 또는 ASP(Active Server Pages) 요청 및 응답 개체와 같은 COM IStream 인터페이스를 지원하는 다른 개체를 사용하여 FOR XML 쿼리를 사용할 때 결과를 포함할 수 있습니다.

예를 들어 다음 ASP 코드는 AdventureWorks Sales.Store 샘플 데이터베이스의 테이블에서 xml 데이터 형식 열인 인구 통계를 쿼리한 결과를 보여 줍니다. 특히 쿼리는 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 샘플 데이터베이스가 설치되어 있는지 확인합니다.

    이 예제에서는 ASP 지원을 사용하도록 설정된 IIS(인터넷 정보 서비스) 버전 5.0 이상을 설치해야 합니다. 또한 AdventureWorks 예제 데이터베이스가 설치되어 있어야 합니다.

  2. 이전에 제공된 코드 예를 복사하여 사용하는 XML 또는 텍스트 편집기에 붙여 넣습니다. IIS에 사용되는 루트 디렉터리에 RetrieveResults.asp로 파일을 저장합니다. 일반적으로 루트 디렉터리의 위치는 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: Primary International

  • BusinessType: OS

  • YearOpened: 1974

  • 전문 분야: 도로

  • SquareFeet: 38000

  • Brands: 3

  • 인터넷: 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 샘플 데이터베이스의 Sales.Store 테이블에서 xml 데이터 형식 열인 Demographics를 쿼리한 결과를 보여 줍니다. 이전 예에서와 같이 이 쿼리는 이 열의 항목 값에서 CustomerID가 3인 행을 검색합니다.

이 예제에서는 다음 Microsoft .NET Framework 관리 API를 사용하여 FOR XML 쿼리 결과의 반환 및 렌더링을 수행합니다.

  1. SqlConnection 은 지정된 연결 문자열 변수인 strConn의 내용을 기반으로 SQL Server에 대한 연결을 여는 데 사용됩니다.

  2. 그런 다음 SqlDataAdapter 는 데이터 어댑터로 사용되며 SQL 연결 및 지정된 SQL 쿼리 문자열을 사용하여 FOR XML 쿼리를 실행합니다.

  3. 쿼리가 실행된 후 SqlDataAdapter.Fill 메서드를 호출하고 데이터 세트 인 DataSet, MyDataSet의 해당 항목을 전달하여 데이터 세트 에 FOR XML 쿼리 출력을 채웁니다.

  4. 그런 다음 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 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(인터넷 정보 서비스) 버전 5.0 이상 버전을 ASP.NET 지원을 사용하도록 설정하여 설치해야 합니다. 또한 AdventureWorks 예제 데이터베이스가 설치되어 있어야 합니다.

  2. 이전에 제공된 코드를 복사하여 사용하는 XML 또는 텍스트 편집기에 붙여넣습니다. IIS에 사용되는 루트 디렉터리에 파일을 RetrieveResults.aspx로 저장합니다. 일반적으로 루트 디렉터리의 위치는 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.

참고 항목

SQL Server xml 데이터 형식 지원을 사용하면 TYPE 지시문을 지정하여 FOR XML 쿼리의 결과를 문자열 또는 이미지 형식 데이터가 아닌 xml 데이터 형식으로 반환할 것을 요청할 수 있습니다. TYPE 지시문이 FOR XML 쿼리에서 사용되는 경우 애플리케이션에서 XML 데이터 사용과 유사한 FOR XML 결과에 프로그래밍 방식으로 액세스할 수 있습니다.

참고 항목