Microsoft SQL Server 2005의 XML 옵션
적용 대상:
Microsoft SQL Server 2005
Microsoft Visual Studio 2005
Microsoft .NET Framework 2.0
XML 및 관계형 데이터
요약: Visual Studio 2005/SQL Server 2005 환경에서 XML 데이터 처리를 위한 세 가지 옵션을 설명하고 이 옵션들 중에서 선택하는 데 도움을 주는 사용 시나리오 및 지침을 제공합니다.
System.Xml, SQLXML 및 XML 데이터 형식 소개
섹션에서는 Microsoft SQL Server 2000에 제공된 XML 지원에 관한 간략한 배경 설명과 함께 XML 및 관계형 데이터 조작을 위해 Microsoft Visual Studio 2005/SQL Server 2005 환경에 제공된 세 가지 옵션의 개요를 제공합니다. 이 세 옵션은 1) System.Xml 이름 공간의 클래스, 2) SQLXML 클래스, 3) SQL Server 2005에 제공된 XML 데이터 형식입니다.
사용자에게 다음과 같은 기능을 제공하기 위해 XML 지원이 Microsoft SQL Server 2000에 추가되었습니다.
이 지원은 이후의 SQLXML 웹 릴리스에서 더욱 향상되었습니다. 향상 기능은 다음과 같습니다.
Microsoft .NET Framework 1.0은 XML 문서 읽기, 쓰기 및 처리를 위한 포괄적인 지원을 제공합니다. 이 지원은 다양한 XML 클래스의 성능 및 유용성을 개선하기 위해 .NET Framework 2.0에서 보다 더 강화되었습니다. .NET Framework에서 제공하는 System.Xml 이름 공간의 새 클래스는 XML 데이터를 관계형 데이터에 매핑하는 데 사용될 수 있습니다.
SQLXML은 SQL Server 데이터베이스에 있는 관계형 데이터와 XML의 원활한 통합을 가능하게 하는 일련의 라이브러리 및 기술입니다. SQLXML은 중간 계층 구성 요소이며 FOR XML 및 OPENXML에서 제공하는 서버 쪽 XML 지원을 포함하지 않습니다. SQLXML은 관계형 원본 데이터에서 XML을 생성하고 다시 관계형 테이블에 관계형 정보를 나타내는 XML을 로드하기 위한 스키마 중심의 매핑 방법을 제공합니다. SQLXML 클래스는 XML 지원을 SQL Server 2000 데이터베이스 이상 버전에 제공합니다.
Microsoft SQL Server 2005에는 XML 데이터 형식의 형태로 된 XML에 대한 기본 제공 지원이 추가되었습니다. XML 데이터는 XML 데이터 형식 열에 원시적으로 저장될 수 있습니다. 그 뿐만 아니라 XML 데이터 형식 열은 XML 스키마 모음을 이 열에 연결함으로써 한층 더 제약될 수 있습니다. XML 데이터 형식 열에 저장된 XML 값은 XQuery 및 XML DML(Data Modification Language)을 통해 조작될 수 있습니다. 쿼리 성능 향상을 위해 인덱스를 XML 데이터를 기반으로 구축할 수 있습니다. 또한 FOR XML 및 OPENXML이 새로운 XML 데이터 형식을 지원하도록 향상되었습니다.
이전의 다양한 SQL Server 버전에 제공된 XML 기능과 더불어 XML 데이터를 저장 및 처리하기 위해 SQL Server 2005에 새롭게 도입된 기능은 XML 데이터를 XML 응용 프로그램에 저장하고 처리할 수 있는 여러 방법을 개발자에게 제공합니다. SQL Server 2005에서 제공하는 대체 접근 방법을 사용하여 XML 응용 프로그램을 구축할 수 있는 방법에는 여러 가지가 있으므로 올바른 선택을 할 수 있도록 다양한 기술 시나리오, 트레이드 오프 및 시너지 효과를 이해하는 것이 중요합니다. 이 문서는 SQL Server 2005에서의 XML 응용 프로그램을 개발을 위해 적합한 대안을 선택하는 데 도움이 되는 지침을 제공합니다.
XML 사용 시나리오
XML이 사용되는 영역은 크게 다음과 같이 분류될 수 있습니다.
이제 위에서 언급한 범주에 속하는 몇 가지 시나리오를 설명하겠습니다. SQL Server 2005/Visual Studio 2005 환경에서 사용할 수 있는 여러 XML 옵션 처리에 대한 자세한 설명과 함께 이 시나리오에 대한 솔루션이 다음에 이어지는 섹션에 제공되어 있습니다.
시나리오 1: 보험금 청구
인터넷 상에서 서비스를 제공하는 한 자동차 보험 회사는 보험 구매자 또는 대리인이 회사의 웹 사이트를 통해 보험금 청구를 신청할 수 있도록 합니다. 이러한 청구는 본사에 있는 중앙 집중식 시스템에서 처리됩니다. 처리가 완료되면 이 시스템은 청구에 관련된 특정 정보를 특정 XML 형식으로 저장해야 합니다. 법적인 목적으로 이러한 XML 문서의 정확한 복사본이 이 시스템에서 유지 관리되어야 합니다. 이 시나리오는 콘텐츠 관리를 위한 XML 사용을 보여줍니다.
시나리오 2: 자동차 제조업체 및 부품 공급업체 사이의 데이터 교환 I
자동차 제조업체는 회사에 필요한 부품을 조달하기 위해 여러 부품 공급업체와 상호 작용합니다. 현재 이 제조업체는 공급업체들로부터 송장을 받습니다. 그러고 나면 이 송장에 해당하는 데이터가 기존의 송장 처리 시스템에 수동으로 전달됩니다. 송장 처리 시스템은 데이터를 관계형 형식으로 저장합니다. 이제 제조업체는 기존 송장 처리 시스템으로의 송장 데이터 전달 절차를 자동화하기를 원합니다. 이 시나리오는 비즈니스 통합을 위한 XML 사용의 예입니다.
시나리오 3: 자동차 제조업체와 부품 공급업체 사이의 데이터 교환 II
이 시나리오에는 이전 시나리오에서 언급한 대로 여러 부품 공급업체와 상호 작용하는 자동차 제조업체가 관련됩니다. 제조업체의 현 시스템은 공급업체가 송장의 현황을 확인하거나 제조업체의 지불 지침 복사본을 얻기 위한 기능을 제공하지 않습니다. 현재로서는 단지 전화를 통해서만 이 정보를 공급업체가 이용할 수 있습니다. 공급업체가 이 작업을 자동으로 수행할 수 있도록 자동차 제조업체는 이 정보를 웹 상에 노출할 수 있어야 합니다. 이 시나리오는 비즈니스 통합을 위한 XML의 사용을 보여줍니다.
시나리오 4: 콘텐츠 관리 시스템
의료, 법 및 기술 분야의 정보를 웹, 책, CD-ROM 등의 다양한 채널을 통해 고객들에게 제공하는 한 회사는 고객들에게 더 빠른 시간 내에 고품질의 콘텐츠를 전달할 수 있는 콘텐츠 관리 시스템을 구축하기를 원합니다. 이 시나리오는 콘텐츠 관리를 위한 XML의 사용을 예시합니다.
시나리오 5: 고객 설문조사
인터넷에서 항공권 예약 서비스를 제공하는 한 회사는 현 시즌에 고객들에게 가장 인기 있는 여행 목적지를 확인하기 위해 각 계절마다 설문조사를 실시합니다. 각 계절에 사용되는 질문은 서로 다르며 이 질문은 나중에 변경될 수 있습니다. 회사는 정보를 분석하고 분석 결과는 최대 고객 수의 요구를 충족할 수 있는 패키지 여행 정책을 설계하는 데 사용됩니다. 이 시나리오는 콘텐츠 관리를 위한 XML의 사용으로 분류될 수 있습니다.
.NET Framework의 XML 클래스
Microsoft .NET Framework에는 XML 기반 제품 개발을 위한 탁월한 지원 기능이 있습니다. .NET Framework에서 XmlTextReader, XmlTextWriter, XmlDocument, XmlValidatingReader 등과 같은 핵심 클래스는 모든 XML 클래스의 루트 이름 공간인 System.Xml 이름 공간에서 사용할 수 있습니다. 이들 핵심 클래스는 사용자가 스트림 기반 및 DOM 기반(문서 개체 모델 기반) 탐색/액세스 모델을 모두 사용하여 XML 문서를 읽고 쓰고 확인할 수 있게 해줍니다. System.Xml 이름 공간은 다음과 같은 하위 이름 공간을 포함합니다.
System.Xml 이름 공간의 향상 기능
Visual Studio 2005에서 XsltCommand와 같은 새로운 클래스와 XmlDocument와 같은 기존 XML 클래스의 기능 향상은 XML 문서 수정, XSL 변환 적용 등을 포함하여 XML 데이터에 대해 다양한 작업을 수행하는 데 사용될 수 있습니다.
System.Xml 이름 공간의 XML 클래스와 관련된 Visual Studio 2005의 몇 가지 향상된 기능은 다음과 같습니다.
System.Xml의 기능 향상에 대한 자세한 내용은 Visual Studio 2005 및 .NET Framework 2.0 릴리스를 위한 System.Xml의 새로운 기능 (영문) 백서를 참조하십시오.
System.Xml 이름 공간의 클래스는 사용자 지정 XML 구문 분석, 조작 및 저장 논리를 구현하는 데 사용될 수 있습니다. SQL Server 2005의 공용 언어 런타임(CLR) 호스팅 기능을 활용하고 Visual Studio 2005의 XML 클래스를 사용하여 XML 처리를 중간 계층 또는 데이터베이스 계층에서 수행할 수 있습니다.
.NET Framework XML 클래스의 사용에는 XML 문서를 데이터베이스에 [n]varchar(max) 또는 varbinary(max) 형식의 열로 또는 파일 시스템에 파일로 저장하고, System.Xml 이름 공간의 클래스를 사용하여 중간 계층 또는 데이터베이스에서 이러한 문서를 처리하는 작업이 포함됩니다. .NET Framework의 XML 클래스는 또한 XML 데이터 형식으로 저장된 데이터에 작업하는 데 사용될 수 있습니다.
.NET Framework XML 클래스는 다음의 경우에 적합합니다.
XML을 저장하는 데 [n]varchar(max), varbinary(max) 또는 XML 데이터 형식을 사용할 수 있습니다.
[n]varchar(max) 또는 varbinary(max)를 사용할 경우 다음과 같은 이점을 얻을 수 있습니다.
XML 데이터 형식 사용의 이점은 후반부의 섹션에 설명되어 있습니다.
중간 계층에서 XML 처리 수행
XML 처리는 .NET Framework에서 제공하는 다양한 XML 클래스를 사용하여 중간 계층에서 수행될 수 있습니다. 앞서 언급한 대로, 이 접근 방법을 채택하면 XML 문서는 데이터베이스에 [n]varchar(max) 형식 또는 XML 형식의 열로 저장되거나 파일 시스템에 파일로 저장될 수 있습니다. 중간 계층에서는 이러한 문서를 데이터베이스에서 가져와서 다음과 같이 사용자의 요구 사항에 따라 처리할 수 있습니다.
데이터베이스에서 XML 처리 수행
SQL Server 2005와 CLR의 통합으로 인해 개발자들은 .NET Framework에서 제공하는 XML 클래스를 사용하여 데이터베이스 계층에서도 처리를 수행할 수 있습니다. 이 통합은 .NET Framework에서 지원하는 모든 언어에서 저장 프로시저 작성, 함수, 트리거 및 사용자 정의 형식의 기능을 제공합니다. 또한 CLR 호스팅은 완전한 .NET Framework 기반 클래스 라이브러리에 대한 액세스 권한도 제공합니다. 결과적으로 앞 섹션에서 설명한 여러 XML 처리 옵션은 데이터베이스에서도 수행될 수 있습니다.
CLR 통합 사용의 이점은 다음과 같습니다.
SQL Server 2005에서 데이터베이스 개발자는 저장 프로시저, 트리거 및 사용자 정의 함수를 위한 두 가지 옵션을 가질 수 있습니다. 이 옵션은 Transact-SQL 및 .NET Framework에서 사용할 수 있는 모든 언어(C# 또는 Visual Basic .NET)입니다. 언어의 선택은 데이터에 수행하는 작업의 종류에 따라 달라집니다. Transact-SQL은 코드가 절차적 논리를 거의 또는 전혀 사용하지 않고서 데이터 액세스를 대부분 수행하는 경우에 가장 적합합니다. 관리되는 클래스는 문자열 처리, 날짜 작업, 시스템 리소스 액세스, 파일 액세스 또는 이미지 처리와 같이 계산 집중적인 함수 및 절차에 가장 적합합니다.
데이터베이스 계층에서 .NET Framework의 XML 클래스 사용에 따르는 단계는 다음과 같습니다.
시나리오 분석
보험금 청구는 청구 ID, 정책 번호, 청구 중재 데이터 등과 같은 데이터 중심 정보와 사고 손해에 대한 설명과 같은 문서 중심 정보를 포함합니다. XML 문서는 데이터 중심 및 문서 중심 정보 집계에 있어 탁월합니다. 제공된 시나리오 (시나리오 1: 보험금 청구 섹션 참조)에서의 주요 요구 사항은 보험금 청구의 정확한 복사본을 XML 형식으로 유지 관리해야 한다는 점입니다. SQL Server에서는 보험금 청구를 [n]varchar(max) 또는 varbinary(max) 형식의 열로 데이터베이스에 저장하여 이 요구 사항을 쉽게 충족할 수 있습니다. 중요하지 않은 공백, 특성 순서, 이름 공간 접두사 및 XML 선언 등과 같은 정보를 보존해야 하는 경우에는 문서를 저장하는 데 XML 데이터 형식을 사용하지 않아야 한다는 점에 주의해야 합니다.
이점
저장소 매체로서 [n]varchar(max) 또는 varbinary(max)를 사용하고 XML 문서의 조작을 위해 System.Xml 이름 공간의 클래스를 사용하는 경우의 이점은 다음과 같습니다.
제한
저장을 위해 [n]varchar(max) 또는 varbinary(max) 사용 시 및 XML 인스턴스 처리를 위해 System.Xml 이름 공간의 클래스 사용 시 제한 사항은 다음과 같이 요약될 수 있습니다.
.NET Framework에서 XML 클래스 사용의 예
이 문서의 앞부분에서 설명한 보험금 청구 시나리오를 생각해 봅시다(시나리오 1: 보험금 청구 섹션 참조). 보험 회사는 청구가 승인되면 법적인 목적으로 청구 정보를 저장하기를 원합니다. 청구 정보는 데이터베이스에 [n]varchar(max) 데이터 형식으로 저장될 수 있습니다.
응용 프로그램의 흐름은 다음과 같습니다.
1. 청구 처리 후 응용 프로그램은 청구를 승인하거나 거부합니다. 2. System.Xml 이름 공간의 클래스를 사용하여 청구용 XML 문서가 생성됩니다. 3. 생성한 XML 문서는 저장 프로시저로 전달됩니다. 4. 저장 프로시저는 XML 문서를 테이블에 삽입합니다. 다음 코드 예제는 시스템에서 사용할 수 있는 청구 정보를 사용하여 XML 문서를 생성하고 XML 문서를 데이터베이스에 삽입합니다.
using System;
using System.Xml;
using System.IO;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace InsuranceClaim
{
class Insurance
{
static void Main(string[] args)
{
Insurance.InsertInsuranceClaim();
}
static void InsertInsuranceClaim()
{
StringWriter strWriter = null;
XmlWriter writer = null;
XmlWriterSettings settings = null;
SqlConnection connection = null;
SqlCommand command = null;
try
{
strWriter = new StringWriter();
settings = new XmlWriterSettings();
//Use indenting for readability.
settings.Indent = true;
settings.Encoding = System.Text.Encoding.UTF8;
writer = XmlWriter.Create(strWriter, settings);
//Write the XML delcaration.
writer.WriteStartDocument();
writer.WriteStartElement("InsuranceClaim");
writer.WriteStartElement("ClaimInfo");
writer.WriteElementString("ClaimID", "C1234");
writer.WriteElementString("ClaimType", "3");
writer.WriteStartElement("SettlementDetails");
writer.WriteStartElement("PaymentDetails");
writer.WriteElementString("PaidTo", "Jeff");
writer.WriteElementString("Amount", "2000");
writer.WriteElementString("Date", "05/12/2002");
writer.WriteElementString("ApprovedBy", "Mike");
writer.WriteEndElement();//End of PaymentDetails
writer.WriteEndElement();//End of SettlementDetails
writer.WriteEndElement();//End of ClaimInfo
writer.WriteStartElement("DamageReport");
writer.WriteString("Minor accident occured on ");
writer.WriteElementString("Address", "ABC Street, Sample City, Sample State");
writer.WriteString(" due to ");
writer.WriteElementString("Cause", "bad weather");
writer.WriteString(" resulted in damage to ");
writer.WriteElementString("DamagedItem", "Head Lights");
writer.WriteElementString("DamagedItem", "Engine");
writer.WriteEndElement();//End of DamageReport
writer.WriteEndElement();//End of InsuranceClaim
writer.WriteEndDocument();
//Write the XML to file and close the writer.
writer.Flush();
connection = new SqlConnection();
connection.ConnectionString = @"server=localhost;
database=AdventureWorks;Integrated Security=SSPI;";
command = connection.CreateCommand();
command.CommandText = "InsertInsuranceClaim";
command.CommandType = System.Data.CommandType.StoredProcedure;
command.Parameters.Add("@CustomerID",
System.Data.SqlDbType.Char);
command.Parameters.Add("@Claim",
System.Data.SqlDbType.VarChar);
String xml = strWriter.ToString();
string strCustomerID = "1001";
command.Parameters[0].Value = strCustomerID;
command.Parameters[0].Size = strCustomerID.Length;
command.Parameters[1].Value = xml;
command.Parameters[1].Size = xml.Length;
connection.Open();
command.ExecuteNonQuery();
connection.Close();
}
finally
{
if (connection.State == ConnectionState.Open)
connection.Close();
if (writer != null)
writer.Close();
if (strWriter != null)
strWriter.Close();
}
}
}
}
다음은 데이터베이스 테이블을 만드는 스크립트입니다.
CREATE TABLE [InsuranceClaim](
[CustomerID] [char](4) NOT NULL,
[Claim] [varchar](max) NOT NULL,
[ModifiedDate] [datetime] NOT NULL DEFAULT (getdate())
)
다음 저장 프로시저는 XML 문서를 데이터베이스에 삽입하는 데 사용됩니다.
CREATE PROCEDURE [dbo].[InsertInsuranceClaim]
@CustomerID [char](4),
@Claim [varchar](max)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [InsuranceClaim] ( CustomerID, Claim )
VALUES ( @CustomerID, @Claim )
END;
SQLXML
SQL Server 2000에 도입된 SQLXML은 클라이언트 쪽의 XML 처리와 관련된 기능의 전 범위를 포괄합니다. SQLXML은 관계적으로 구조화된 데이터를 설명하는 XML을 사용하여 SQL Server 데이터베이스에서 관계형 데이터의 원활한 통합을 가능하게 하는 일련의 라이브러리 및 기술입니다.
SQL 2000 이전에는 개발자들이 관계형 데이터와 XML 형식의 데이터 간에 상호 작용을 위한 코드 레이어를 제공해야 했습니다. 하지만 SQLXML의 등장으로 관계형 데이터와 XML 사이의 연결이 제공되었으므로 작업이 더욱 편리해졌습니다. 이 문서에 설명된 항목은 SQLXML 관리 클래스에 제한됩니다. 이 라이브러리의 다른 기능 적용 가능성에 관한 자세한 내용은 MSDN에서 SQLXML (영문) 페이지를 참조하십시오.
SQLXML은 XML 지원을 위해 SQL Server에 도입된 많은 기능으로 구성됩니다. 이러한 기능은 다음과 같습니다.
- 클라이언트 쪽에서 쿼리 결과를 XML로 변환하는 기능
- HTTP를 사용하여 SQL Server에 액세스하는 기능 - 다음을 수행할 수 있습니다.
저장 프로시저, 사용자 정의 함수 및 템플릿 쿼리에서 제공되는 기능을 SOAP 기반 웹 서비스로 노출하는 기능 SQLXML 관리 클래스를 사용하여 SQLXML에서 제공되는 XML 기능의 이점을 활용하도록 .NET Framework에서 코드를 작성하는 기능
클라이언트 쪽 XML 서식 설정. 클라이언트 쪽에서 FOR XML 절을 지정하면 중간 계층에서 쿼리에 대한 응답으로 서버가 반환한 행 집합에 대해 FOR XML 변환을 수행합니다. 클라이언트 쪽에서 XML 서식 설정을 수행하려면:
SQLXML 관리 클래스를 사용하여 다음 작업을 수행할 수 있습니다.
관계형 데이터를 XML 문서로 노출하기 위해 SQLXML을 사용하는 것은 다음과 같은 경우에 적합한 선택입니다.
시나리오 분석
XML 사용 시나리오에 설명된 첫 번째 데이터 교환 시나리오(시나리오 2: 자동차 제조업체와 부품 공급업체 간의 데이터 교환 I 섹션 참조)에서, 자동차 제조업체와 여러 부품 공급업체 간의 상호 작용은 SQLXML 사용의 전형적인 경우를 나타냅니다. 제조업체는 송장 데이터를 교환하기 위해 여러 공급업체들과 통신해야 합니다. 제안된 솔루션은 이 문제를 해결하기 위해 웹 서비스와 SQLXML을 사용합니다. 제조업체는 공급업체가 제조업체에게 송장을 보내기 위해 사용할 수 있는 웹 서비스를 노출합니다. 웹 서비스는 송장을 공급업체 형식에서 제조업체가 사용하는 일반적인 형식으로 변환하기 위해 고객에 따라 다른 XSLT를 사용합니다. 그런 다음 웹 서비스는 송장 문서의 내용을 관계형 테이블의 열에 매핑하는 XML 뷰를 사용하여 XML 문서를 분할합니다. 기존의 송장 처리 시스템은 관계형 테이블에서 데이터를 선택하여 처리 작업을 진행할 수 있을 것입니다. 이 시나리오의 경우 XML 뷰 사용의 이점은 다음과 같습니다.
이점
SQLXML 사용의 이점은 다음과 같이 요약될 수 있습니다.
제한s
부정적인 면을 들자면, SQLXML이 클라이언트 쪽에서 사용되는 경우 몇 가지 제한이 있습니다.
SQLXML 사용의 예
이제 SQLXML의 개요 설명을 마쳤으니, 다음 단계로 SQLXML 관리 클래스가 적용될 수 있는 예제를 탐구해 봅시다. 특정 고객에 대한 판매 주문 정보를 내보내는 간단한 예제를 살펴보겠습니다. 이 예제에 사용되는 테이블은 AdventureWorks 데이터베이스에서 이용할 수 있습니다.
데이터베이스의 데이터는 프레젠테이션 계층에서 표시될 수 있는 XML 형식으로 클라이언트에서 사용할 수 있어야 합니다. 그런 다음 SQL 데이터베이스의 관계형 데이터가 어떻게 SQLXML 클래스를 사용하여 XML 데이터로 조작될 수 있는지 확인하게 될 것입니다. 매핑 XML 스키마가 XML 노드 이름을 테이블 필드에 매핑하고 조작하는 데 사용됩니다. SQLXML 관리 라이브러리를 사용한 관계형 데이터 조작에 관한 자세한 내용은 MSDN에서 SQLXML (영문) 페이지를 참조하십시오.
아래의 주석 달린 XSD 스키마는 관계형 테이블 [Sales.Customer], [Sales.SalesOrderHeader], [Sales.SalesOrderDetail]과 고객에 대한 판매 주문 정보의 대상 XML 표시 사이에 매핑을 정의합니다. 또한 아래 XSD 스키마에서 보는 바와 같이 XSD 매핑 스키마를 사용하여 XML에서의 부모(parent)-자식(child) 관계도 정의될 수 있습니다.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="CustomerOrderHeader"
parent="Sales.Customer"
parent-key="CustomerID"
child="Sales.SalesOrderHeader"
child-key="CustomerID" />
<sql:relationship name="OrderHeaderOrderDetail"
parent="Sales.SalesOrderHeader"
parent-key="SalesOrderID"
child="Sales.SalesOrderDetail"
child-key="SalesOrderID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Customer" sql:relation="Sales.Customer" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Order" sql:relation="Sales.SalesOrderHeader"
sql:relationship="CustomerOrderHeader" maxOccurs="unbounded" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="OrderDetail"
sql:relation="Sales.SalesOrderDetail"
sql:relationship="OrderHeaderOrderDetail"
maxOccurs="unbounded" >
<xsd:complexType>
<xsd:attribute name="SalesOrderID"
type="xsd:integer" />
<xsd:attribute name="ProductID" type="xsd:integer" />
<xsd:attribute name="OrderQty" type="xsd:integer" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="CustomerID" type="xsd:integer" />
<xsd:attribute name="OrderDate" type="xsd:date" />
<xsd:attribute name="ShipDate" type="xsd:date" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="CustomerID" type="xsd:integer" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
class ExportOrders
{
/// <summary>
/// This method use SqlXmlCommand class to select the records from
/// Sales.Customer, Sales.SalesOrderHeader and Sales.SalesOrderDetail
/// tables.The data is fetched as such from server and formatted into
/// xml at client side. Note that the ClientSideXml is set to true.
/// </summary>
static void Main(string[] args)
{
if (args.Length < 1)
{
Console.WriteLine("Usage");
Console.WriteLine("CustomerOrders <CustomerID> [OrderID]");
return;
}
try
{
StringBuilder strBuilder = new StringBuilder();
strBuilder.Append("/Customer[@CustomerID='");
strBuilder.Append(args[0]);
strBuilder.Append("']");
if (args.Length > 1)
{
strBuilder.Append("/Order[@SalesOrderID='");
strBuilder.Append(args[1]);
strBuilder.Append("']");
}
SqlXmlCommand xmlCommand = new SqlXmlCommand(@"Provider=
SQLOLEDB; Server=localhost; database=AdventureWorks;
Integrated Security=SSPI;");
xmlCommand.ClientSideXml = true;
xmlCommand.RootTag = "CustomerOrders";
xmlCommand.SchemaPath = @"CustomerOrderDetails.xsd";
xmlCommand.CommandType = SqlXmlCommandType.XPath;
xmlCommand.CommandText = strBuilder.ToString();
Stream reader = xmlCommand.ExecuteStream( );
FileStream fsOut = File.Create("CustomerOrder.xml");
StreamWriter sw = new StreamWriter(fsOut);
using (StreamReader sr = new StreamReader(reader))
{
sw.Write(sr.ReadToEnd());
}
sw.Flush();
sw.Close();
fsOut.Close();
}
catch (Exception exception)
{
Console.WriteLine( exception.ToString() );
}
}
}
위에서 제공한 방법은 명령줄 인수로 지정한 Customer ID에 대한 판매 주문 정보를 응용 프로그램으로 내보냅니다. 데이터는 클라이언트 쪽에서 XML 형식으로 변환되므로 서버 쪽에서 성능 문제를 피할 수 있습니다. 위에서 제공한 주석 달린 XSD 스키마 매핑은 CustomerOrderDetails.xsd로 저장되어야 위 코드 단편이 적절하게 작동될 수 있습니다.
참고 데이터베이스에서 데이터를 XML로 가져오는 데 필요한 코드의 양은 예제에서 볼 수 있듯이 아주 적습니다.
관계형/XML 통합을 위한 서버 쪽 지원(FOR XML/OPENXML)
SELECT 문의 FOR XML 확장을 사용하여 서버 쪽에서 SQL 쿼리 결과를 XML 문서로 반환하기 위한 지원이 SQL Server에 제공되어 있습니다. 한편 OPENXML 키워드는 XML 문서에서 행 집합을 추출할 수 있는 기능을 제공합니다.
FOR XML
서버 쪽 FOR XML은 네 가지 XML 변환 모드 RAW, AUTO, EXPLICIT, PATH를 지원합니다.
기본적으로, RAW 모드는 쿼리 결과 집합의 각 행을 XML 요소에 매핑하고 행의 각 열을 특성에 매핑합니다. ELEMENTS 옵션이 ROW 모드로 지정된 경우 행의 각 열은 행에 대해 생성된 요소의 하위 요소에 매핑됩니다. 또한 XMLSCHEMA 옵션을 지정하여 생성된 XML의 인라인 스키마를 요청할 수 있습니다.
AUTO 모드는 기본적으로, SELECT 절에 최소한 하나의 열이 나열된 FROM 절의 각 테이블이 XML 요소에 매핑되고 SELECT 절에 나열된 열이 특성(또는 ELEMENTS 옵션이 지정된 경우 하위 요소)에 매핑되는 경우 중첩된 XML 요소를 생성하기 위한 지원을 제공합니다.
EXPLICIT 모드는 쿼리 결과에서 생성된 XML의 형태를 최대한 제어할 수 있게 해줍니다. 이 모드를 이용하면 쿼리 자체에 원하는 XML에 대해 형식을 지정함으로써 어떠한 형태의 XML이라도 생성할 수 있습니다.
EXPLICT 모드를 사용하여 복잡한 XML 문서를 작성하는 일은 번거롭습니다. PATH 모드를 중첩 FOR XML 쿼리를 작성하는 기능 및 XML 형식 인스턴스를 반환하는 TYPE 지시어와 함께 사용하면 복잡한 EXPLICIT 모드 쿼리 작성을 위한 대안을 얻을 수 있습니다. PATH 모드는 열 이름을 XPath형 구문으로 해석하여 SELECT 쿼리에서 반환한 행 집합의 열을 특성 및 하위 요소에 매핑합니다. SQL Server 2005의 FOR XML 기능 향상에 대한 자세한 내용은 Microsoft SQL Server 2005에서 FOR XML의 새로운 기능 (영문) 백서를 참조하십시오.
OPENXML
sp_xml_preparedocument 및 sp_xml_removedocument 시스템 저장 프로시저와 함께 OPENXML은 XML 문서의 관계형 행 집합 뷰를 제공합니다. XML 문서에서 OPENXML을 사용하려면 sp_xml_preparedocument를 인-메모리 XML 문서 표시를 만드는 데 사용해야 합니다. 이 저장 프로시저는 MSXML 파서를 사용하여 XML 문서를 구문 분석하고 OPENXML과 함께 사용할 수 있는 XML 문서에 핸들을 반환합니다. 이제 XML 문서 핸들과 같은 매개 변수, rowpattern(XML 데이터의 노드를 행에 매핑하는 XPath 식), 행 집합 스키마 및 행 집합 열과 XML 노드 간의 매핑이 OPENXML에 전달될 수 있어 행 집합을 얻을 수 있습니다. XML 문서는 더 이상 필요 없게 되면 sp_xml_removedocument 저장 프로시저를 사용하여 메모리에서 언로드되어야 합니다.
FOR XML의 향상 기능
FOR XML은 SQL Server 2005에서 다음과 같은 기능으로 향상되었습니다.
OPENXML의 향상 기능
SQL Server 2005에서 OPENXML은 다음과 같은 기능을 지원하도록 향상되었습니다.
XML 문서를 작성 및 분리하기 위해 FOR XML 및 OPENXML을 사용하는 것은 다음의 경우에 적합한 선택입니다.
시나리오 분석
시나리오 3의 요구 사항(시나리오 3: 자동차 제조업체와 부품 공급업체 간의 데이터 교환 II 섹션 참조)은 공급업체가 송장의 현황을 입수하거나 지불 지침의 복사본을 얻기 위해 이용할 수 있는 웹 서비스를 제공하는 것입니다. 웹 서비스와 함께 FOR XML은 제조업체가 인터넷에서 이러한 서비스를 노출할 수 있도록 하는 솔루션을 제공합니다. 공급업체는 웹 서비스를 이용하여 송장의 현황에 관해 문의합니다. 그러면 웹 서비스가 공급업체가 제공한 송장 ID를 이용해서 FOR XML 문을 사용하여 관계형 데이터로부터 XML 형식으로 응답을 생성합니다. 생성된 XML 문서는 공급업체에게 반환됩니다. 현재의 시나리오에서 FOR XML 문 기반 접근 방법은 다음과 같은 이점을 제공합니다.
이점
다음은 FOR XML/OPENXML 사용 시의 몇 가지 이점입니다.
제한
XML 문서를 작성 및 분리하기 위해 FOR XML/OPENXML을 사용하는 경우의 제한 사항은 다음과 같습니다.
FOR XML 및 OPENXML 사용의 예
다음 예제는 SQL Server 2005와 함께 제공되는 AdventureWorks 데이터베이스를 사용합니다. 지정된 범위의 고객에 대해 [Sales.Customer], [Sales.SalesOrderHeader], [Production.Product], [Sales.SalesOrderDetail] 테이블에서 고객, 주문 및 주문 상세 정보를 얻기 위해 FOR XML이 사용되는 예제를 살펴보도록 합시다.
예제: FOR XML 사용
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
Detail.SalesOrderID, Detail.LineNumber,Detail.ProductID,
Product.Name,
Detail.OrderQty
FROM Sales.Customer Cust,
Sales.SalesOrderHeader OrderHeader,
Sales.SalesOrderDetail Detail,
Production.Product Product
WHERE Cust.CustomerID = OrderHeader.CustomerID
AND OrderHeader.SalesOrderID = Detail.SalesOrderID
AND Detail.ProductID = Product.ProductID
AND (Cust.CustomerID BETWEEN 44 AND 46)
ORDER BY OrderHeader.CustomerID,
OrderHeader.SalesOrderID
FOR XML AUTO
쿼리 결과는 아래와 같습니다.
<Cust CustomerID="44">
<OrderHeader CustomerID="44" SalesOrderID="53575">
<Detail SalesOrderID="53575" LineNumber="2" ProductID="952" OrderQty="2">
<Product Name="Chain" />
</Detail>
<Detail SalesOrderID="53575" LineNumber="1" ProductID="969" OrderQty="1">
<Product Name="Touring-1000 Blue, 60" />
</Detail>
<Detail SalesOrderID="53575" LineNumber="3" ProductID="972" OrderQty="1">
<Product Name="Touring-2000 Blue, 54" />
</Detail>
</OrderHeader>
<OrderHeader CustomerID="44" SalesOrderID="59024">
<Detail SalesOrderID="59024" LineNumber="1" ProductID="972"
OrderQty="3">
<Product Name="Touring-2000 Blue, 54" />
</Detail>
<Detail SalesOrderID="59024" LineNumber="2" ProductID="957" OrderQty="2">
<Product Name="Touring-1000 Yellow, 60" />
</Detail>
</OrderHeader>
</Cust>
<Cust CustomerID="46">
<OrderHeader CustomerID="46" SalesOrderID="48354">
<Detail SalesOrderID="48354" LineNumber="1" ProductID="730" OrderQty="1">
<Product Name="LL Road Frame - Red, 62" />
</Detail>
</OrderHeader>
</Cust>
다음 예제는 OPENXML 및 XPath 식을 사용하여 XML 문서에 지정된 주문 상세 정보를 추출합니다.
예제: OPENXML 사용
DECLARE @XmlDocumentHandle int
DECLARE @XmlDocument nvarchar(max)
SET @XmlDocument = N'<ROOT>
<Cust CustomerID="44">
<OrderHeader CustomerID="44" SalesOrderID="53575">
<Detail SalesOrderID="53575" LineNumber="2" ProductID="952" OrderQty="2">
<Product Name="Chain" />
</Detail>
<Detail SalesOrderID="53575" LineNumber="1" ProductID="969" OrderQty="1">
<Product Name="Touring-1000 Blue, 60" />
</Detail>
<Detail SalesOrderID="53575" LineNumber="3" ProductID="972" OrderQty="1">
<Product Name="Touring-2000 Blue, 54" />
</Detail>
</OrderHeader>
<OrderHeader CustomerID="44" SalesOrderID="59024">
<Detail SalesOrderID="59024" LineNumber="1" ProductID="972" OrderQty="3">
<Product Name="Touring-2000 Blue, 54" />
</Detail>
<Detail SalesOrderID="59024" LineNumber="2" ProductID="957" OrderQty="2">
<Product Name="Touring-1000 Yellow, 60" />
</Detail>
</OrderHeader>
</Cust>
<Cust CustomerID="46">
<OrderHeader CustomerID="46" SalesOrderID="48354">
<Detail SalesOrderID="48354" LineNumber="1" ProductID="730" OrderQty="1">
<Product Name="LL Road Frame - Red, 62" />
</Detail>
</OrderHeader>
</Cust>
</ROOT>'
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @XmlDocumentHandle OUTPUT, @XmlDocument
-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@XmlDocumentHandle, '/ROOT/Cust/OrderHeader/Detail',2)
WITH (CustomerID varchar(10) '../@CustomerID',
OrderID int '../@SalesOrderID',
LineNumber int '@LineNumber',
ProductID int '@ProductID',
Quantity int '@OrderQty')
-- Remove the internal representation.
EXEC sp_xml_removedocument @XmlDocumentHandle
쿼리 결과는 아래와 같습니다.
-------------------------------------------------------- CustomerID OrderID LineNumber ProductID Quantity -------------------------------------------------------- 44 53575 2 952 2 44 53575 1 969 1 44 53575 3 972 1 44 59024 1 972 3 44 59024 2 957 2 46 48354 1 730 1 --------------------------------------------------------
SQL Server 2005의 XML 데이터 형식
XML 데이터의 계층적 특성으로 인해 데이터의 구조가 복잡해질수록(예: 계층 깊이의 증가) XML 데이터를 관계형 데이터로 모델링하기가 어려워집니다. 게다가 XML 데이터가 관계형 데이터에 매핑될 때 XML 인스턴스에 있는 요소의 순서가 유지되지 않으며 분리된 관계형 데이터에서 원래의 XML 문서를 작성하는 데 관련하여 많은 비용이 듭니다. XML 데이터를 저장하기 위한 관계형 모델의 제한 사항 때문에 XML 인스턴스를 원시적으로 저장하는 것이 가장 좋습니다. 원시 XML 인스턴스는 관계형 모델의 제한 사항에 영향을 받지 않으며 계층 구조 데이터 또는 중첩 데이터를 처리하는 기능, 요소의 순서를 유지하는 기능, XML 데이터를 저장 및 검색하는 간편한 방법, 다중 스키마를 지원하는 유연성 등과 같은 기능을 제공합니다.
Microsoft SQL Server 2005는 XML 데이터 처리를 위한 광범위한 지원을 제공합니다. SQL Server 2005에서는 XML 값이 XML 데이터 형식 열에 원시적으로 저장될 수 있어 XML 스키마의 모음에 따라 형식화되거나 혹은 형식화되지 않은 상태로 있을 수 있습니다. 세분화된 데이터 조작은 XQuery 및 XML DML을 사용하여 지원되며 후자의 경우는 데이터 수정을 위한 확장입니다. 게다가 XML 열은 쿼리 성능 향상을 위해 인덱스될 수 있습니다.
형식화된 XML
형식화된 XML은 XML 데이터를 설명하는 XML 스키마가 있는 경우에 이상적입니다. 이와 같은 경우 XML 스키마 모음을 XML 열에 연결하여 형식화된 XML을 제공할 수 있습니다. XML 형식 열에 대한 유효성 검사는 열과 연결된 XML 스키마 모음을 기준으로 수행됩니다. 또한 형식화된 XML 데이터는 노드 값의 런타임 변환이 필요하지 않으므로 형식화된 XML 데이터를 포함하는 쿼리의 성능은 형식화되지 않은 XML 데이터와 비교하여 더 우수합니다.
형식화되지 않은 XML
형식화되지 않은 XML의 사용은 스키마가 있지만 서버에서 데이터 유효성을 검사하기를 원하지 않는 경우 또는 사용할 수 있는 스키마가 없는 경우에 적합합니다. 다음과 같은 경우에는 스키마가 제공되어 있어도 형식화되지 않은 XML을 저장할 수 있습니다.
형식화되지 않은 XML 문서는 어떤 스키마와도 연결되지 않은 경우에라도 제대로 형성될 수 있도록 검사됩니다. 형식화되지 않은 XML은 노드 값의 런타임 변환으로 인해(노드 값이 내부적으로 유니코드 문자열로 저장되기 때문), 성능 손실을 초래한다는 점에 주의하십시오.
XML 데이터 형식의 사용 시나리오
SQL Server 2005의 새로운 XML 데이터 형식을 사용하면 이제 다음과 같은 작업을 할 수 있습니다.
XML 데이터 형식 메서드 및 XML DML
XML 데이터 형식 열에 대한 쿼리 및 조작은 다섯 가지 메서드를 통해 지원됩니다. XML 문서의 조각은 XML 데이터 형식의 query() 메서드를 사용하여 추출될 수 있습니다. query() 메서드는 XQuery 식을 인수로 받아들여 형식화되지 않은 XML 인스턴스를 반환합니다. 스칼라 값은 XQuery 식과 반환되기를 원하는 SQL 형식을 지정하여 value() 메서드를 사용하여 XML 인스턴스에서 추출될 수 있습니다. XML 인스턴스에 대한 존재 확인은 exist() 메서드를 사용하여 수행될 수 있습니다. XML 문서를 관계형 데이터로 분해하는 작업이 nodes() 메서드를 통해 용이해집니다.
데이터 조작 작업은 modify() 메서드를 사용하여 XML 인스턴스에서 수행될 수 있습니다. XML DML 지원은 XQuery에 추가된 삽입, 삭제, 업데이트 키워드를 통해 제공됩니다. 삽입, 삭제, 업데이트 키워드를 각각 사용하여 하나 이상의 노드가 삽입, 삭제 및 업데이트될 수 있습니다.
XML 인덱싱
XML 데이터 형식 열에서 쿼리 처리 작업에 포함되는 구문 분석 및 분할은 XML 인스턴스의 크기가 매우 큰 경우 엄청나게 긴 시간이 소비될 수 있습니다. XML 데이터 형식의 쿼리 성능은 이러한 열에 인덱스를 생성함으로써 향상될 수 있습니다. XML 데이터의 크기 및 사용 시나리오는 필요한 인덱스의 종류를 지정하는 데 중요한 역할을 수행합니다. SQL Server는 두 가지 종류의 인덱스, 즉 주 XML 인덱스와 보조 XML 인덱스를 지원하며 후자는 전자 없이는 존재할 수 없습니다.
XML 열에서 주 XML 인덱스의 생성은 XML BLOB를 분할하고 이 값을 내부 테이블에 저장합니다. 이로 인해 런타임에 수반되는 분할 작업이 없어져 쿼리 실행 시간 동안 성능이 향상되었습니다. 사용 시나리오에 따라 보조 XML 인덱스를 생성함으로써 쿼리 성능을 한층 더 향상시킬 수 있습니다. 각각 경로, 속성, 값을 기준으로 쿼리 성능을 향상시키기 위해 보조 XML 인덱스의 세 가지 유형인 PATH, PROPERTY, VALUE를 만들 수 있습니다. XML 형식 열에 적합한 보조 인덱스 선택에 관한 자세한 내용은 “XML 데이터 형식을 위한 성능 최적화” 백서에서 볼 수 있습니다.
XML 문서를 XML 데이터 형식으로 저장하는 것은 다음의 경우에 적합한 선택입니다.
시나리오 분석: 콘텐츠 관리 시스템
이제 XML 사용 시나리오(시나리오 4: 콘텐츠 관리 시스템 섹션 참조)에서 설명한 콘텐츠 관리 시스템을 분석해 봅시다. 출판 회사는 텍스트, 이미지, 오디오, 비디오 등 다양한 형식의 정보를 처리합니다. 독립적으로 사용될 수 있는 정보 블록은 다양한 소스에서 수집되고 데이터베이스에서 유지 관리됩니다. 이러한 정보 블록은 구성 요소로 알려져 있습니다. 개별 구성 요소를 조합하여 문서가 만들어집니다. 문서에 어떤 구성 요소가 포함되는지는 사용자의 요구에 따라 다릅니다. 이러한 문서는 다양한 채널을 통해 가입한 사용자들에게 제공됩니다. 콘텐츠 관리 시스템은 일반적으로 높은 성능과 확장성을 갖추고 콘텐츠를 저장, 조회, 검색 및 업데이트할 수 있는 능력이 있어야 합니다.
통합 데이터 모델인 XML은 동일한 문서에 XML 데이터 및 XML 콘텐츠를 모두 저장할 수 있는 뛰어난 옵션을 제공합니다. XML은 또한 데이터에서 표시를 분리하는 기능을 제공하는데, 이 기능은 동일한 정보가 각 사용자마다 서로 다르게 표시될 수 있기 때문에 중요합니다. SQL Server 2005에서 제공하는 원시 XML 데이터 형식을 사용하여 이러한 콘텐츠 관리 시스템의 요구 사항을 맞출 수 있습니다. XML 데이터 형식을 사용하면 XML 문서를 저장하고, XML DML을 사용하여 요소 수준에서 XML 문서를 수정하고 XQuery를 사용하여 XML 문서에서 쿼리를 수행할 수 있습니다.
시나리오 분석: 고객 설문조사
고객 설문조사 XML 사용 시나리오(시나리오 5: 고객 설문조사 섹션 참조)에서 주요 요구 사항은 여러 스키마를 사용하는 설문조사 정보를 저장할 수 있는 능력입니다. 고정 스키마가 없는 데이터는 관계형 테이블을 하나만 사용하여 모델링될 수 없습니다. XML 열이 있는 관계형 테이블은 이러한 정보를 저장할 수 있는 우수한 옵션을 제공합니다. 설문조사의 형식을 저장하기 위해 추가 열을 관계형 테이블에 추가할 수 있습니다. 설문조사 형식 열을 사용하여 설문조사 형식의 모든 레코드를 반입함으로써 설문조사의 특정 형식에 해당하는 정보를 분석할 수 있습니다. 일반적인 설문조사에서 고객은 대개 모든 질문에 대해 대답하지는 않습니다. 따라서 몇 개의 열을 만들고(설문조사에서 각 질문마다 하나씩) 대답하지 않은 질문에 대해 데이터베이스에 NULL 값을 저장하는 대신, 하나의 열에 고객 한 명에 대한 설문조사 정보를 XML로 저장하는 것이 유용할 수 있습니다. 이 시나리오의 경우에는 다음과 같은 이유 때문에 고객 설문조사 정보를 XML 형식 열로 저장하는 것이 더 적절합니다.
이점
XML 데이터를 XML 데이터 형식 열에 저장할 경우의 이점은 다음과 같이 요약될 수 있습니다.
제한
다음은 새로운 XML 데이터 형식으로 작업할 경우에 알아두어야 할 제한 사항들 중 일부입니다.
- XML 열이 기본 키 또는 외부 키 제약 조건의 일부가 될 수 없습니다.
- XML 열을 GROUP BY 문에서 그룹화 값으로 사용할 수 없습니다.
XML 데이터 형식 사용의 예
예제 응용 프로그램은 AdventureWorks 데이터베이스에서 Sales.Store 테이블을 사용합니다. Sales.Store 테이블은 기본 키로 CustomerID를, XML 열로 Demographics를 포함합니다. Demographics 열은 Store Survey 정보를 포함합니다. Store Survey의 일부로 저장된 정보는 선택적입니다. 이는 Demographics 열이 모든 요소를 포함할 수도 있고 그렇지 않을 수도 있음을 의미합니다. 동일한 정보가 관계형 형식으로 저장된 경우에는 이들 요소를 테이블의 열로 만들어야 합니다. Store Survey 정보의 대부분은 선택적이기 때문에 이 열은 데이터의 대부분에 대해 NULL 값을 포함할 것입니다. 이러한 낭비를 피하기 위해 Demographics 열에 있는 Store Survey 정보는 XML 형식으로 저장됩니다. Demographics 열은 판매 정보 즉, 각 고객에 대한 연간 판매, 연간 수익, 은행 이름 등을 포함합니다. 이들 필드는 데이터의 XML 요소로 저장됩니다.
예제 응용 프로그램은 다음 기능을 수행합니다.
응용 프로그램이 System.Data.SqlTypes.SqlXml 클래스를 사용하여 XML 열에서 데이터를 검색합니다. SQLXML 클래스는 XML 열에 대한 직접적인 매핑입니다.
SQLXML 클래스를 사용하면 어떤 매핑이나 변환 없이도 XML 열에서 데이터를 직접 검색할 수 있습니다.
여기에서 customer ID 12에 대한 Annual Revenue 요소를 검색하는 방법의 예를 살펴보도록 합시다. 다음 코드 예제는 위에서 언급한 두 번째 기능을 보여줍니다.
Public void RetreiveAnnualRevenue ()
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = @"Server=localhost; Database=AdventureWorks;
integrated security=SSPI";
conn.Open();
SqlCommand command = conn.CreateCommand();
command.CommandText = @"select Demographics.query(
'declare namespace SS="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey"
<StoreInfo>
<AnnualRevenue>
{data(/SS:StoreSurvey/SS:AnnualRevenue)}
</AnnualRevenue>
</StoreInfo>') as
Result from Sales.Store where CustomerID=12";
SqlDataReader datareader = command.ExecuteReader();
System.Text.StringBuilder builder = new System.Text.StringBuilder();
While (datareader.Read())
{
SqlXml sqlxml = datareader.GetSqlXml(0);
builder.Append(sqlxml.Value);
}
//Note: xml1 is a XML web control
this.xml1.DocumentContent = builder.ToString();
this.xml1.TransformSource = @"StoreInfo.xslt";
}
위 메서드에서는 AdventureWorks 데이터베이스에 SqlConnection 개체의 인스턴스를 만듭니다. 명령 텍스트 속성은 customer ID 12에 대한 Annual Revenue 필드의 값을 검색하는 쿼리를 포함합니다.
이 코드는 XML 열에서 직접적으로 실행되는 XQuery 입니다. 쿼리의 반환 값은 XML 조각으로서 SQLXML 클래스에 매핑됩니다. 그러고 나서 XML 조각은 SQLXML 클래스의 Value 속성을 사용하여 검색될 수 있습니다.
그런 다음 검색된 XML 조각은 XML 웹 서버 컨트롤을 사용하여 클라이언트 응용 프로그램에 표시됩니다.
다양한 접근 방법 비교
기능 | .NET Framework의 XML 클래스 | FOR XML / OPENXML | SQLXML | XML 데이터 형식 |
---|---|---|---|---|
코드 복잡도 | 높음. XML 데이터와 관계형 데이터 사이를 직접적으로 매핑하는 클래스가 없습니다. | 보통. FOR XML EXPLICIT를 사용한 쿼리 작성이 어렵습니다. | 낮음. 클래스가 관계형 데이터를 XML 데이터로 조작하는 메커니즘을 제공하고 또한updategrams가 레코드를 업데이트하는 기능을 제공합니다. | 낮음. XML 데이터가 그 자체로서 열에 저장되므로 복잡도가 줄어듭니다. 뿐만 아니라 Visual Studio 2005는 XML 데이터 형식을 조작하기 위한 클래스를 제공합니다. XML DML은 XML 데이터를 수정하는 데 사용할 수 있습니다. |
유지 관리성 | 복잡함. 테이블의 필드 또는 XML을 변경하는 데 코드 변경이 필요합니다. | 어려움. 테이블의 필드 또는 XML을 변경하는 데 쿼리 변경이 필요합니다. | 쉬움. 대부분의 경우 매핑 XSD 파일을 수정하면 변경 사항이 적용될 수 있습니다. | 쉬움. XQuery는 데이터베이스의 XML 열 쿼리를 위한 쉬운 구문을 제공합니다. |
설치 | .NET Framework 이외의 다른 특별한 설치가 필요하지 않습니다. | 특별한 설치가 필요하지 않습니다. | SQLXML 라이브러리가 클라이언트 시스템에 설치되어 있어야 합니다. | 특별한 설치가 필요하지 않습니다. |
보안 | 정상적인 경우에는 데이터 유형 및 형식이 클라이언트 쪽에 노출되지 않기 때문에 상당히 안전합니다. | 테이블 이름 및 열 이름의 노출을 방지하도록 적절한 주의를 기울인다면 안전합니다. | 매핑 XSD 파일이 중간 계층 대신 클라이언트 쪽에 저장된 경우 매핑 XSD 파일의 보안을 유지하도록 설계해야 합니다. | 보안됨 |
.NET Compact Framework에 대한 지원 | 제한된 지원. Microsoft .NET Compact Framework에서 XmlDataDocument는 지원되지 않습니다. | 지원됨 | 지원되지 않음 | 지원되지 않음. SQL Server의 XML 데이터 형식 열이 SQL Server 모바일에 동기화되면 ntext로 변환됩니다. |
데이터 유효성 검사 | 클라이언트 및 서버에 의해 실행될 수 있습니다. | 서버에 의해 실행될 수 있습니다. | 클라이언트에 의해 수행될 수 있습니다. | XML 스키마를 사용하여 서버에 의해 실행될 수 있습니다. |
데이터 저장소 | [n]varchar(max), XML, or varbinary(max) | 관계형 테이블(XML을 필드로 사용할 수 있음) | 관계형 테이블(XML을 필드로 사용할 수 있음) | XML 데이터 형식 |
충실도 | 원문 충실도(바이트 수준에서 XML 데이터를 보존함) | 관계 충실도(데이터의 계층 구조는 보존하지만 요소 간의 순서는 무시함) | 관계 충실도 | InfoSet 충실도(XML 데이터의 InfoSet 콘텐츠를 보존함) |
저장소에서의 데이터 액세스 및 업데이트 | 문서 수준에서 업데이트를 지원합니다. | 세분화된 데이터 액세스 및 업데이트를 지원합니다. | 세분화된 데이터 액세스 및 업데이트를 지원합니다. | 세분화된 데이터 액세스 및 업데이트를 지원합니다. |
결론
이 문서에서는 SQL Server 2005에서 XML을 처리하기 위한 여러 옵션에 대해 알아보았습니다. System.Xml 이름 공간, SQLXML 및 XML 데이터 형식을 각각의 관련 이점 및 제한과 함께 예제 시나리오를 들어 설명했습니다. 이상적인 시나리오에서 나타난 성과를 통해 사용자는 자신의 응용 프로그램에 맞는 적절한 XML 옵션을 선택할 수 있습니다.
추가 정보
- Microsoft SQL Server 2005 웹 사이트
- Microsoft SQL Server 2005에서의 XML 지원
- Microsoft SQL Server 2005를 위한 최상의 XML 사용 방법
- Microsoft SQL Server 2005에서 FOR XML의 새로운 기능
- XML 데이터 형식을 위한 성능 최적화
[출처] Microsoft SQL Server 2005의 XML 옵션|작성자 필립박
'데이터베이스 > SQL Server' 카테고리의 다른 글
SQL Server 2005에서 XML 데이터 형식을 위한 성능 최적화 (0) | 2008.04.28 |
---|---|
Microsoft SQL Server 2005의 원시 XML 웹 서비스 개요 (0) | 2008.04.28 |
저장 프로시저의 테스트 자동화 (0) | 2008.04.28 |
mssql2000 = > mssql2005으로 복원 (0) | 2008.04.28 |
DBCC DBREINDEX를 이용해서 한번에 한 서버의 모든 데이터베이스의 인덱스 재 작성하기 (0) | 2008.04.28 |