sql xml datatype 관련

풀그림 2010. 12. 22. 15:23

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

 

Posted by 파이팅야
,