본문 바로가기

MSSQL

SQL Server 2005 개발자 가이드[8/13]


XML 개선기능

XML은 엔터프라이즈 비즈니스 솔루션의 핵심 기술이 되어 왔습니다. SQL Server 2005에서는 SQL Server 2000에서 지원하던 XML 지원 기능에 비해 한층 발전된 XML 기능을 지원하여, 관계형 데이터나 XML 데이터를 기반으로 솔루션을 쉽게 생성하도록 합니다.

SQL Server 2000에서는 SELECT 문장에 FOR XML 절을 추가하여 데이터베이스 엔진에서 쿼리결과를 XML 형식으로 반환하도록 지정하거나, OPENXML 함수를 통해 XML 관련 기능을 지원하였습니다. SQL Server 2005에서는 XML 지원기능이 한층 강화되었습니다.

FOR XML 절 개선
SQL Server 2005에서는 FOR XML 절의 기능이 개선되었고, SQL Server 데이터베이스에 저장된 데이터를 XML 형식으로 생성하는 절차의 성능이 개선되었습니다.

RAW 모드 쿼리 내부에 ELEMENTS 지시어 사용
SQL Server 2000에서는 FOR XML 쿼리에 대한 RAW 모드에서는 속성기반 XML만 반환할 수 있었습니다. SQL Server 2005에서는 ELEMENTS 지시어를 사용하여 RAW 모드에서도 엘리먼트기반 XML을 반환하도록 지정할 수 있습니다.
SELECT ProductID, Name, ListPrice
FROM Production.Product
FOR XML RAW, ELEMENTS

Null 엘리먼트 지원
Null 컬럼을 생략하지 않고, xsi:nil 속성을 사용하여 빈 엘리먼트로 대체하여 표시하도록 설정할 수 있습니다. AUTO, RAW, PATH 모드 쿼리에서 XSINIL 옵션을 ELEMENTS 지시어와 함께 사용하거나, EXPLICIT 모드 쿼리에 elementxsinil 컬럼 모드를 사용할 수 있습니다.

다음 예제는 null 값을 빈 엘리먼트로 조회하는 방법을 나타냅니다.
-- ELEMENTS 지시어와 함께 XSINIL 사용
SELECT ProductID, Name, Color
FROM Production.Product Product
FOR XML AUTO, ELEMENTS XSINIL

-- EXPLICIT 모드에서 elementsxinil 사용
SELECT 1 AS Tag,
NULL AS Parent,
ProductID AS [Product!1!ProductID],

Name AS [Product!1!ProductName!element],
Color AS [Product!1!Color!elementxsinil]
FROM Production.Product
FOR XML EXPLICIT

인라인 XSD 스키마
SQL Server 2000에서는 인라인 XDR 스키마만 반환할 수 있었습니다. SQL Server 2005에서는 XMLSCHEMA 지시어를 사용하여 인라인 XSD 스키마도 반환할 수 있습니다.

다음의 예제는 인라인 XSD 스키마를 조회하는 방법을 나타냅니다.
SELECT ProductID, Name, ListPrice
FROM Production.Product Product
FOR XML AUTO, XMLSCHEMA

XML 데이터형을 위한 TYPE 지시어
SQL Server 2005에는 XML 데이터형이 새로 추가되었습니다. FOR XML 쿼리에서 TYPE 지시어를 지정하면, 결과값을 varchar 문자열이 아닌 XML 데이터로 반환할 수 있습니다. AUTO 모드나 RAW 모드 쿼리에서 여러 레벨의 XML 결과값을 반환하기 위해서는 FOR XML 쿼리를 중첩해서 사용해야 합니다.

다음의 예제는 FOR XML 쿼리를 중첩해서 사용하기 위해서 TYPE 지시어를 사용하는 방법을 나타냅니다.
SELECT ProductID, Name, ListPrice,
  (SELECT ReviewerName, Comments
   FROM Production.ProductReview ProductReview
   WHERE ProductReview.ProductID = Product.ProductID
   FOR XML AUTO, ELEMENTS, TYPE)
FROM Production.Product Product
FOR XML AUTO

PATH 모드
SQL Server 2005에서는 FOR XML 쿼리에 대해서 PATH 모드를 새로 지원합니다. PATH 모드를 사용하면, 속성, 엘리먼트, 하위엘리먼트, 텍스트 노드, 데이터값에 값을 매핑하기 위해서 XPath 유사 구문을 사용하여 컬럼을 지정합니다. PATH 모드를 사용하면, EXPLICIT 모드를 사용하지 않고서도, 복잡한 XML 데이터를 생성할 수 있습니다.

다음 예제는 PATH 모드를 사용하는 방법을 나타냅니다.
SELECT ProductID AS“ @ProductID”,
         Name AS“ *”,
         Size AS“ Description/@Size”,
         Color AS“ Description/text( )”
FROM Production.Product
FOR XML PATH
잘 정의된(well-formed) 결과값을 위한 ROOT 지시어
FOR XML 쿼리는 XML 일부를 반환하고, 잘 정의된(well-formed) XML 문서의 형태로 반환하는 것은 아닙니다. ROOT 지시어를 사용하여, 루트 엘리먼트의 명칭을 지정하면, FOR XML 쿼리결과에 루트 엘리먼트를 추가하여 잘 정의된 XML 문서형태로 반환할 수 있습니다.

다음 예제는 ROOT 지시어를 사용하는 방법을 나타냅니다.
SELECT ProductID, Name, ListPrice
FROM Production.Product Product
FOR XML AUTO, ROOT‘( Products’)
RAW 모드와 PATH 모드에서 명명된 엘리먼트 지원
기본값으로, RAW 모드와 PATH 모드 쿼리에서는 쿼리에서 반환하는 각 행을 <row> 엘리먼트로 반환합니다. RAW 모드와 PATH 모드에서 반환하는 각 행에 대해 <row> 엘리먼트 대신, 별도의 엘리먼트 명칭을 부여할 수 있습니다.

다음 예제는 RAW 모드에서 명명된 엘리먼트를 반환하는 방법을 나타냅니다.
SELECT ProductID, Name, ListPrice
FROM Production.Product
FOR XML RAW‘( Product’)

OPENXML 함수 개선기능
SQL Server 2000에서는 XML 문서를 관계형 표형식 행집합으로 표현하기 위해서 OPENXML 함수를 지원하였습니다. SQL Server 2005에서는 OPENXML 함수에 대해 개선 된 기능을 제공하며, XML 데이터로부터 표 형식 데이터를 생성하는 솔루션을 생성할 수 있게 도와줍니다.

XML 문서를 XML 데이터형 값으로 지정
SQL Server 2000은, sp_xml_preparedocument 저장 프로시저를 사용하여, 문서 핸들을 생성하기 위해서 varchar, nvarcahr, text, ntext 변수를 사용하였습니다. SQL Server 2005에서는 XML 변수를 사용할 수 있습니다.

다음 예제는 sp_xml_preparedocument 저장 프로시저와 함께 XML 변수를 사용하는 방법을 나타냅니다.
DECLARE @doc xml
SET @doc =‘ <?xml version=”1.0”?>
<SalesInvoice InvoiceID=”1000”CustomerID=”123”>
<Items>
<Item ProductCode=”12”Quantity=”2”UnitPrice=”12.99”/>
<Item ProductCode=”41”Quantity=”1”UnitPrice=”17.45”/>
<Item ProductCode=”2”Quantity=”1”UnitPrice=”2.99”/>
</Items>
</SalesInvoice>’
DECLARE @docHandle int
EXEC sp_xml_preparedocument @docHandle OUTPUT, @doc
SELECT * FROM
OPENXML(@docHandle,‘ SalesInvoice/Items/Item’, 1)
WITH
(ProductCode int,
Quantity int,
UnitPrice smallmoney)
EXEC sp_xml_removedocument @docHandle

WITH 절에 XML 데이터형 지원
SQL Server 2005에는, OPENXML 함수에 WITH 절을 사용하여, XML 데이터형 컬럼을 반환할 수 있습니다.

다음 예제는 OPENXML 함수에 WITH 절을 사용하여 XML 컬럼을 반환하는 방법을 나타냅니다.
SELECT * FROM
OPENXML(@docHandle,‘ SalesInvoice’, 1)
WITH
(InvoiceID int,
CustomerID int,
OrderDate datetime,
Items xm‘l Items’

배치 수준 영역정의(scoping)
SQL Server 2000에서는 sp_xml_preparedocument 저장프로시저에 의해 반환된 XML 문서 핸들이 세션이 살아있는 동안 유지되었으며, 심지어 문서핸들 변수가 변수가 선언된 영역을 벗어나더라도 사용될 수 있었습니다. SQL Server 2005에서는 XML 문서 핸들이 배치가 종료되면 바로 제거되기 때문에, 서버 자원에 대한 사용률을 감소시켜 줍니다.

ENXML 함수 사용방법
다음 예제는 XML 문서에서 관계형 표형식 행집합을 반환하는 방법을 나타냅니다. Xml 변수를 sp_xml_preparedocument 저장 프로시저에 전달할 수 있으며, OPENXML 함수의 WITH 절을 사용하여 XML 컬럼값을 반환할 수 있습니다.
DECLARE @doc xml
SET @doc =‘ <?xml version=”1.0”?>
<SalesInvoice InvoiceID=”1000”CustomerID=”123”OrderDate=”2004-03-07”>
<Items>
<Item ProductCode=”12”Quantity=”2”UnitPrice=”12.99”/>
<Item ProductCode=”41”Quantity=”1”UnitPrice=”17.45”/>
<Item ProductCode=”2”Quantity=”1”UnitPrice=”2.99”/>
</Items>
</SalesInvoice>’
DECLARE @docHandle int
EXEC sp_xml_preparedocument @docHandle OUTPUT, @doc SELECT * FROM
OPENXML(@docHandle,‘ SalesInvoice’, 1)
WITH
(InvoiceID int,
CustomerID int,
OrderDate datetime,
Items xm‘l Items’)

Items 컬럼에 저장된 XML 데이터가 다음과 같이 조회됩니다.
InvoiceID CustomerID OrderDate Items
1000 123 2004-03-07
00:00:00.000
<Items>
<Item ProductCode=”12”
Quantity=”2”UnitPrice=”12.99”/>
<Item ProductCode=”41”
Quantity=”1”UnitPrice=”17.45”/>
<Item ProductCode=”2”
Quantity=”1”UnitPrice=”2.99”/>
</Items>
XML 데이터형 사용
SQL Server 2005에서는 새로운 XML 데이터형을 지원하며, XML 데이터형을 통해, XML 데이터를 SQL Server 2005 데이터베이스 저장하고 조작할 수 있습니다. XML 데이터형을 사용하는 방법과 데이터베이스내에서 XML 스키마를 관리하는 방법에 대해서 설명합니다.

데이터베이스에 XML 데이터 저장
SQL Server 2000의 XML 지원기능을 통해, 관계형 데이터를 XML로 변환할 수 있으며, XML 데이터를 관계형 데이터로 변환할 수도 있습니다. 하지만, SQL Server 2000에서 지원하는 XML 기능은 XML 형식의 데이터를 분산 어플리케이션에서 서로 주고받기 위해서 사용할 수는 있지만, 여전히 데이터베이스에 저장될 때는 관계형 저장소에 저장될 수 밖에 없었습니다.

SQL Server 2005에서는 XML 과 관계형 데이터간에 단순한 변환기능도 지원할 뿐만 아니라, XML 데이터형을 통해, 데이터베이스에 XML 데이터를 저장할 수 있습니다.

데이터베이스에 XML 데이터를 저장하는 이유
관계형 데이터베이스에 XML 데이터 자체를 저장하는 기능은 어플리케이션 개발자에게 많은 장점을 제공합니다. XML 데이터를 직접 데이터베이스에 저장함으로써 얻을 수 있는 효과는 다음과 같습니다.

    구조화된 데이터와 반구조화된(semistructured) 데이터를 단일 위치에 저장할 수 있기 때문에,
       관리상 편의를 제공합니다.
    관계형 모델내에 가변적인 컨텐츠를 정의할 수 있습니다.
     데이터 저장소의 최적화와 쿼리 환경의 효율성을 보장하면서도, 어플리케이션에 특화된 요구
       사항을 충족시킬 수 있는 좀 더 유연한 데이터 모델을 제공할 수 있습니다.

네이티브 XML 기능 지원
XML 데이터형에는 내부적으로 매우 효율적인 형태로 XML 문서의 InfoSet이 저장됩니다.
XML 데이터는 불필요한 공백, 속성의 순서, 네임스페이스 전치사, 저장되지 않는 XML 선언부를 제외한 원본 XML 문서가 그대로 저장됩니다. SQL Server 2005의 XML 데이터형에서 지원하는 기능은 다음과 같습니다.

     XML 인덱스. XML 데이터형으로 정의된 컬럼에 XML 인덱스와 전체-텍스트 검색 인덱스를
        생성할 수 있습니다. XML인덱스를 사용하면,XML데이터에 대한 쿼리의 성능을 개선할 수 있습
        니다.

     XQuery 기반 데이터 조회 메서드. XML 데이터형에서는 query, value, exist 메서드를 제공
        합니다. XML 데이터형에서 제공하는 메서드를 통해 XQuery를 사용하여, XML 데이터를 조회할
        수 있습니다.

     XQuery 기반 데이터 변경 메서드. XML 데이터에서는 modify 메서드를 제공하며, XML 데이
        터에 대한 변경작업을 수행하여 XQuery 스펙을 확장하기 위해서 사용합니다.

형식화된 XML과 형식화되지 않은 XML

형식화된 XML
XML 문서에 포함된 엘리먼트와 속성을 정의하고, 해당 문서에서 사용하는 네임스페이스를 지정하기 위한 XML 스키마가 포함된 XML입니다. XML 데이터형에 형식화된 XML 데이터를 저장하면, SQL Server 에서는 해당 스키마 정보를 기준으로 저장되는 XML 데이터에 대한 유효성 검사를 수행하게 되며, 스키마에 저장된 XML 데이터형을 기초로 하여 적절한 SQL Server 데이터 유형을 할당하기 위해 내부적인 저장소를 최적화합니다.

형식화되지 않은 XML
스키마정보가 포함되지 않은 XML입니다. XML 데이터형에 형식화되지 않은 상태로 XML 데이터가 저장되면, SQL Server 에서 해당 XML 데이터에 대해 유효성검사를 수행하지 않습니다. 하지만, 해당 XML 데이터가 잘 구성된(well-formed) 데이터라는 것은 보장할 수 있습니다.
형식화되지 않은 XML 사용방법
스키마에 의해 유효성검사를 하지 않아도 되는 XML 데이터를 저장하기 위해서는 형식화되지 않은 XML 데이터를 XML 데이터형 컬럼과 변수에 저장할 수 있습니다. 형식화되지 않은 XML 데이터를 저장하기 위한 어플리케이션을 개발하기 위해서는 XML 데이터형에 형식화되지 않은 XML 데이터를 저장하는 방법에 대해서 이해할 필요가 있습니다.

XML 컬럼과 변수를 정의
형식화되지 않은 XML 데이터를 저장할 xml 컬럼이나 xml 데이터형을 정의하는 방법은 다른 컬럼이나 SQL Server 데이터형을 정의하는 방법과 동일합니다.
컬럼을 정의하기 위해서는, 다음의 예제와 같이, CREATE TABLE 문장에 xml 데이터형을 지정하면 됩니다.

CREATE TABLE Sales.Invoices
(InvoiceID int,
SalesDate datetime,
CustomerID int,
ItemList xml)

형식화되지 않은 xml 데이터형 변수를 정의하기 위해서는, 다음의 예제와 같이, DECLARE 문장에 xml 데이터형을 지정하면 됩니다.
DECLARE @itemDoc xml

문자열 값의 암시적인 캐스팅
XML 데이터형 변수나 XML 데이터형 컬럼에 형식화되지 않은 XML 데이터를 할당하기 위한 가장 단순한 방법은 잘 정의된(well-formed) 문서나 XML 문서의 일부분을 문자열(varchar, nvarchar, text, ntext) 값으로 할당하는 것입니다. SQL Server 에서는 자동적으로 해당 문자열값을 XML 데이터형으로 암시적으로 변환합니다.

다음 예제는 형식화되지 않은 XML 값을 할당하기 위해 암시적인 형변환을 사용하는 방법을 나타냅니다.
DECLARE @itemString nvarchar(2000)
SET @itemString =‘ <Items>
<Item ProductID=”2”Quantity=”3”/>
<Item ProductID=”4”Quantity=”1”/>
</Items>’
DECLARE @itemDoc xml
SET @itemDoc = @itemString
INSERT INTO Sales.Invoices
VALUES
(1, GetDate( ), 2, @itemDoc)
동일한 원칙을 사용하여, 다음 예제와 같이, 고정 문자열 표현식으로 XML 데이터형 컬럼에 데이터를 추가할 수 있습니다.

INSERT INTO Sales.Invoices
VALUES
(1, GetDate( ), 2,‘ <Items>
<Item ProductID=”2”Quantity=”3”/>
<Item ProductID=”4”Quantity=”1”/>
</Items>’)


문자열을 명시적으로 XML으로 캐스팅
명시적으로, T-SQL CAST 함수를 사용하여 문자열 값을 XML 데이터형으로 형변환할 수 있습니다.

DECLARE @castedDoc xml
SET @castedDoc = CAST(@itemString AS xml)

문자열을 XML로 명시적으로 형변환
명시적으로, T-SQL CONVERT 함수를 사용하여 문자열 값을 XML 데이터형으로 형변환할 수 있습니다.

DECLARE @convertedDoc xml
SET @convertedDoc = CONVERT(xml, @itemString)


잘 구성된(well-formed) XML 사용
문자열 값을 XML 데이터형으로 형변환하는 방법과 상관없이, XML 데이터형에 저장될 XML 데이터는 반드시 잘 정의된(well-formed) XML 데이터이어야 하며, 잘 정의된(wellformed) XML 데이터가 아닌 경우에는 오류가 발생합니다. XML 데이터형 컬럼 또는 XML 데이터형 변수에 저장되기 위해서는, 단일 루트 엘리먼트를 가지는 잘 정의된 XML 문서이거나, 다수의 잘 정의된 엘리먼트로 구성된 잘 정의된 XML 문서의 일부(fragment)이어야 합니다.

다음 예제는 잘 정의된 XML 데이터와 잘 정의되지 않은 XML 데이터를 나타냅니다.

DECLARE @itemXml xml
-- 잘 정의된 XML 문서. 정상적으로 할당됨
SET @itemXml =‘ <Items>
<Item ProductID=”2”Quantity=”3”/>
<Item ProductID=”4”Quantity=”1”/>
</Items>’

-- 잘 정의된 XML 조각. 정상적으로 할당됨.
SET @itemXml =‘ <Item ProductID=”2”Quantity=”3”/>
<Item ProductID=”4”Quantity=”1”/>’

-- 잘 정의되지 않은 XML 데이터. 오류 발생.
SET @itemXml =‘ <Items>
<Item ProductID=”2”Quantity=”3”/>
<Item ProductID=”4”Quantity=”1”/>’


XML 스키마 관리
형식화된 XML 데이터를 사용하기 위해서는, 데이터베이스 XML 스키마를 등록해야 합니다. XML 스키마에는 형식화된 XML 문서에서 사용하는 네임스페이스와, XML 문서에 포함된 엘리먼트와 속성에 대한 정의가 포함되어 있습니다.

XML 스키마 컬렉션 생성
XML 스키마는 데이터베이스의 XML 스키마 컬렉션 개체에 등록됩니다. 각 XML 스키마 컬렉션에는 하나 또는 그 이상의 XML 스키마가 포함되며, 각 스키마에는 사용할 네임스페이스가 지정됩니다.(XML 스키마의 TargetNamespace 속성에 지정)

XML 스키마 컬렉션을 생성하기 위해서는, CREATE XML SCHEMA COLLECTION 문장을 사용합니다. CREATE XML SCHEMA COLLECTION 문장에 대한 구문은 다음과 같습니다.

CREATE XML SCHEMA COLLECTION sql_identifier AS Expression

sql_identifier 는 XML 스키마 컬렉션에 대한 유효한 T-SQL 식별자입니다.
Expression 은 하나 또는 그 이상의 XML 스키마 문서를 포함하고 있는 XML 데이터입니다.
다음 예제는 XML 스키마 컬렉션을 생성하는 방법을 나타냅니다.
CREATE XML SCHEMA COLLECTION ResumeSchemaCollection
AS
N’<?xml version=”1.0”?>
<xsd:schema targetNamespace=” http://schemas.adventureworks.
com/EmployeeResume”
xmlns=”http://schemas.adventure-works.com/EmployeeResume”
elementFormDefault=”qualified”
attributeFormDefault=”unqualified”
xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
<xsd:element name=”resume”>
<xsd:complexType>
<xsd:sequence>
<xsd:element name=”name”type=”xsd:string”minOccurs=”1”
maxOccurs=”1”/>
<xsd:element name=”employmentHistory”>
<xsd:complexType>
<xsd:sequence minOccurs=”1”maxOccurs=”unbounded”>
<xsd:element name=”employer”>
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base=”xsd:string”>
<xsd:attribute name=”endDate”use=”optional”/> </xsd:extension> </xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

스키마 정보 조회
다음 예제와 같이, sys.xml_schema_collections 카탈로그 뷰를 사용하여, 데이터베이스에 저장된 스키마 컬렉션에 대한 정보를 조회할 수 있습니다.

SELECT * FROM sys.xml_schema_collections

다음 예제와 같이, sys.xml_schema_collections 카탈로그 뷰를 사용하여, 데이터베이스 스키마 컬렉션에 정의된 개별 XML 네임스페이스를 조회할 수 있습니다.

SELECT * FROM sys.xml_schema_namespaces

다음 예제와 같이, sys.xml_components 카탈로그 뷰를 사용하여, 데이터베이스에 정의된 XML 구성요소에 대한 정보를 조회할 수 있습니다.

SELECT * FROM sys.xml_components

스키마 컬렉션 수정
ALTER XML SCHEMA COLLECTION 명령을 사용하여, XML 스키마 컬렉션을 변경할 수 있습니다. ALTER XML SCHEMA COLLECTION 명령을 사용하여, 스키마 컬렉션에 스키마를 추가하거나 제거할 수 있습니다.

스키마 컬렉션 삭제
다음 예제와 같이, DROP XML SCHEMA COLLECTION 명령을 사용하여, XML 스키마 컬렉션을 제거할 수 있습니다.

DROP XML SCHEMA COLLECTION ResumeSchemaCollection

형식화된 XML 컬럼에서 참조하고 있는 스키마를 포함하고 있는 XML 스키마 컬렉션은 삭제할 수 없습니다. 해당 XML 스키마 컬렉션을 삭제하기 위해서는, 사전에 테이블을 변경하거나 삭제하여, XML 스키마에 대한 참조정보를 삭제해야 합니다.
형식화된 XML 사용방법
XML 스키마 컬렉션을 등록한 다음, 형식화된 XML 데이터에 대한 유효성 검사를 하기 위해 XML 스키마를 사용할 수 있습니다.

형식화된 컬럼 또는 변수 정의
형식화된 XML 데이터를 사용하기 위해서는, XML 컬럼 또는 XML 변수를 선언할 때, XML 데이터에 대한 유효성검사를 하기 위해 사용할 XML 스키마를 포함하고 있는 XML 스키마 컬렉션을 연결해 주어야 합니다.

다음 예제는 ResumeSchemaCollection XML 스키마 컬렉션을 사용하여, XML 데이터형 컬럼을 정의하는 방법을 나타냅니다.

CREATE TABLE HumanResources.EmployeeResume
 (EmployeeID int,
  Resume xml (ResumeSchemaCollection))

동일한 방법으로, 다음 예제와 같이, 형식화된 XML 변수를 선언할 수 있습니다.

DECLARE @resumeDoc xml (ResumeSchemaCollection)


형식화된 값 할당
형식화되지 않은 XML 데이터와 동일한 방법으로, 형식화된 XML 컬럼 또는 형식화된 XML 변수에 XML 데이터를 저장할 수 있습니다. 하지만, 입력되는 XML 문자열이 반드시 해당 컬럼이나 변수에 지정된 XML 스키마 컬렉션에 포함된 XML 스키마에 적합한 형식이어야 하며, 동일 대상 네임스페이스 내에서 선언되어야 합니다.

다음 예제는 형식화된 XML 데이터를 삽입하는 방법을 나타냅니다.

INSERT INTO HumanResources.EmployeeResume
VALUES
(1,
‘<?xml version=”1.0”?>
<resume
    xmlns=”http://schemas.adventure-works.com/EmployeeResume”>
<name>Guy Gilbert</name>
<employmentHistory>
  <employer endDate=”2000-07-07”>Northwind Traders</employer>
  <employer>Adventure Works</employer>
</employmentHistory>
</resume>’)


CONTENT 및 DOCUMENT 키워드 사용
형식화된 XML 컬럼 또는 변수에 단일 문서만 저장될 수 있도록 제한할 것인지, 여러 개의 문서로 구성된 XML 조각이 저장되도록 허용할 것인지를 지정하기 위해, 해당 XML 컬럼이나 변수를 정의할 때, CONTENT 키워드나 DOCUMENT 키워드를 지정할 수 있습니다.
CONTENT 키워드를 지정하면, 유효한 XML 조각을 저장하도록 허용하며, DOCUMENT 키워드를 지정하면, 단일 XML 문서만 저장될 수 있도록 허용합니다.

아무 키워드도 지정되지 않으면, 기본값은 CONTENT로 정의됩니다.

다음 예제는 DOCUMENT 키워드를 사용하여 XML 컬럼에 단일 XML 문서만 저장되도록 하는 방법을 나타냅니다.

CREATE TABLE HumanResources.EmployeeResume
(EmployeeID int,
Resume xml (DOCUMENT ResumeSchemaCollection))


XML 인덱스 관리
XML 인덱스란?
XML 컬럼에 대한 쿼리 성능을 향상시키기 위해서, XML 인덱스를 생성할 수 있습니다. XML 인덱스를 생성할 때 고려해야 할 고려사항은 다음과 같습니다.

    XML 인덱스를 생성하려고 하는 테이블에 클러스터형 기본키가 반드시 존재해야 합니다. XML
       인덱스가 존재하는 경우, 해당 테이블의 클러스터형 기본키를 수정할 수 없습니다. 해당 테이블의
       클러스터형 기본키를 수정하기 위해서는, 먼저 모든 XML 인덱스를 삭제해야만 합니다.
    XML 컬럼별로 기본 XML 인덱스는 하나만 생성할 수 있습니다.
    PATH, PROPERTY, VALUE 쿼리를 위해, 부가 XML 인덱스를 생성할 수 있습니다.
    동일한 테이블에 XML 인덱스와 비-XML 인덱스를 동시에 생성할 수 없습니다.

기본 XML 인덱스 생성
CREATE PRIMARY XML INDEX 명령을 사용하여 XML 컬럼에 기본 XML 인덱스를 생성할 수 있습니다.

CREATE PRIMARY XML INDEX xidx_Item
ON Sales.Invoices(ItemList)


PATH 인덱스 생성
경로나 데이터값을 지정하여, XML 컬럼으로부터 데이터를 조회하는 쿼리가 존재한다면, 부가 PATH 인덱스를 생성할 것을 고려해야 합니다.
예를 들어, /ItemList/Item[@ProductID=”1”]와 같은 XPath 표현식이 존재하는지 체크해야하는 쿼리를 실행해야 한다면, PATH 인덱스를 생성할 것을 고려해야 합니다.

다음 예제는 사전에 생성된 기본 XML 인덱스를 사용하여 PATH 인덱스를 생성하는 방법을 나타냅니다.

CREATE XML INDEX xidx_ItemPath
ON Sales.Invoices(ItemList)
USING XML INDEX xidx_Item
FOR PATH


PROPERTY 인덱스 생성
경로를 지정하여, XML 컬럼으로부터 노드 값을 조회해야 하는 쿼리를 실행해야 하는 경우 에는 부가 PROPERTY 인덱스를 생성할 것을 고려해야 합니다.
예를 들어, (/ItemList/Item/@ProductID)[1]와 같은 XPath 표현식에 의해서 지정된 노드의 값을 반환하는 쿼리가 존재한다면, PROPERTY 인덱스를 생성할 것을 고려해야 합니다.

다음 예제는, 사전에 생성된 기본 XML 인덱스를 사용하여 PROPERTY 인덱스를 생성하는 방법을 나타냅니다.

CREATE XML INDEX xidx_ItemProp
ON Sales.Invoices(ItemList)
USING XML INDEX xidx_Item
FOR PROPERTY


VALUE 인덱스 생성
부정확한 경로를 지정하여, XML 컬럼으로부터 데이터를 조회하는 쿼리를 실행해야 한다면, 부가 VALUE 인덱스를 생성할 것을 고려해야 합니다.
예를 들어, (//Item[@ProductID=”1”]와 같은 XPATH 표현식으로 특정 노드의 존재여부를 체크해야하는 쿼리를 실행해야 한다면, VALUE 인덱스를 생성할 것을 고려해야 합니다.

다음 예제는 사전에 생성된 기본 XML 인덱스를 사용하여 VALUE 인덱스를 생성하는 방법을 나타냅니다.

CREATE XML INDEX xidx_ItemVal
ON Sales.Invoices(ItemList)
USING XML INDEX xidx_Item
FOR VALUE


XML 인덱스 수정
ALTER INDEX 문장을 사용하여, 다음 예제와 같이, XML 인덱스(기본 또는 부가)를 변경할 수 있습니다.

ALTER INDEX xidx_Item ON Sales.Invoices REBUILD


XML 인덱스 삭제
DROP INDEX 문장을 사용하여, 다음 예제와 같이, XML 인덱스를 삭제할 수 있습니다.

DROP INDEX xidx_Item ON Sales.Invoices


[출처] DBGuide.net