l 개요
n xml 데이터 형식을 사용하면 XML 문서와 조각을 SQL Server 데이터베이스에 저장할 수 있습니다. xml 유형의열과 변수를 만들어 데이터베이스에 XML 인스턴스를 저장할 수 있습니다. 저장된 xml 데이터 형식 인스턴스 표현은 2GB를 초과할 수 없습니다.
n 선택적으로 XML 스키마 컬렉션을 xml 데이터 형식의 열, 매개 변수 또는 변수와 연결할 수 있습니다. 컬렉션의스키마는 XML 인스턴스의 유효성을 검사하고 이 인스턴스를 형식화하는 데 사용됩니다. 이 경우 XML이 형식화되었다고 합니다.
l Xml 데이터 유형 메서드
n Query() - XML 인스턴스(Nodes)에 대해 쿼리합니다
u 예
declare @myDoc xml
set @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
<Warranty>1 year parts and labor</Warranty>
<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>'
SELECT @myDoc.query('/Root/ProductDescription/Features')
u 결과
<Features>
<Warranty>1 year parts and labor</Warranty>
<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
n Value()- XML 인스턴스에서 SQL 유형의 값을 검색합니다
u 예
n value() 사용예, 첫번째productID attribute의값검색해서prodID 변수에셑팅함
DECLARE @myDoc xml
DECLARE @ProdID int
SET @myDoc = '<Root>
<ProductDescription ProductID="2" ProductName="Road Bike1">
<Features>
<Warranty>1 year parts and labor1</Warranty>
<Maintenance>3 year parts and labor extended maintenance is available1</Maintenance>
</Features>
</ProductDescription>
</Root>'
SET @ProdID = @myDoc.value('(/Root/ProductDescription/@ProductID)[1]', 'int' )
SELECT @ProdID
u 결과
2
n Exists() - 쿼리에서 비어 있지 않은 결과를 반환하는지 여부를 확인합니다.
u 예
declare @x xml
declare @f bit
set @x = '<root Somedate = "2002-01-01Z"/>'
set @f = @x.exist('/root[(@Somedate cast as xs:date?) eq xs:date("2002-01-01Z")]')
select @f
u 결과
1
n Modify() - 업데이트를 수행하도록 XML DML 문을 지정합니다. (XML 데이터에서 노드를 삽입, 업데이트 또는삭제합니다)
u 예
DECLARE @myDoc xml
SET @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
</Features>
</ProductDescription>
</Root>'
SELECT @myDoc
n insert first feature child (no need to specify as first or as last)
SET @myDoc.modify('
insert <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
into (/Root/ProductDescription/Features)[1]')
SELECT @myDoc
u 결과
<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>
n Nodes() - XML을 여러 행으로 나누어 XML 문서 부분을 행 집합으로 전파합니다
u 예
DECLARE @x xml
SET @x='<Root>
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>moe</name></row>
<row id="3" />
</Root>'
SELECT T.c.query('.') AS result
FROM @x.nodes('/Root/row') T(c)
u 결과
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>moe</name></row>
<row id="3" />
l XML Data Model 이 필요한 경우
n 데이터가 산발적이거나 데이터 구조를 알 수 없거나 데이터 구조가 이후에 크게 변경될 수 있습니다.
n 데이터가 엔터티 간 참조 대신 포함 계층을 나타내며 재귀적일 수 있습니다.
n 데이터에 정렬이 내재되어 있습니다.
n 데이터 구조를 기반으로 데이터를 쿼리하거나 데이터 일부를 업데이트하고자 합니다.
l 장점
n Xml column에 데이터를 저장하면 엔진에서 테이터가 잘 작성되었거나 유효한지 여부를 확인할 수 있습니다.
n XML 데이터의 세부적 쿼리 및 업데이트가 지원됩니다.
n 해당 xml 데이터를 여러 곳에서 공유해서 사용가능 하다.
n XML 쿼리 성능의 속도를 높이기 위해 XML 데이터를 인덱싱할 수 있습니다. 인덱싱 옵션은 스토리지 옵션별로 다르므로 작업을 최적화할 수 있는 적합한 옵션을 선택해야 합니다
l 단점
n XML column 을 사용하는 쪽에서 xml 조작하는 쿼리를 이해하고 있어야 한다.
n SQL 2005 부터 지원하므로 SQL 2000에서는 사용할 수 없다.
l 참고
n 성능상의 이슈로 where 조건에는 exist()를 사용하도록 하는 것이 좋음
n SQL 2000과 SQL 2005에서의 XML Data Update 작업을 비교한 내용
u http://redju.blogspot.com/2006/05/sql-server-2005-xml-1.html
l 개인적인 생각으론 데이터가 산발적이거나 데이터 구조를 알 수없을 때 사용하면 좋을것 같다.
l 물론 XML에 저장된 값으로 검색이 필요하지 않으면 사용하기 더 좋을듯. XML 유효성 체크도 해줘서 좋구
l XML 저장된 값을 검색할려면 인덱싱 해야 하고, 인덱싱 할려면 정해진 XML 형식(Typed XML)이어야 한다. XML 형식이 각각 다른 경우(Untyped XML)에는 인덱싱이 안 되어 느림
l 참고 URL : http://msdn.microsoft.com/en-us/library/ms345117(v=sql.90).aspx