xml 과 sql server 2000 에서 지원하는 xml 처리 방법 정 홍주 webtime feelanet
TRANSCRIPT
XMLXML 과 과 SQL Server 2000SQL Server 2000에서 지원하는 에서 지원하는 XML XML 처리 처리 방법 방법
정 홍주정 홍주
WebTimeWebTimeFeelanetFeelanet
목차목차 .NET Framework.NET Framework SQLXMLSQLXML SQLXML SQLXML 과 관련된 과 관련된 XMLXML 기술기술 SQL Server 2000SQL Server 2000 에서의 에서의 XML XML 지원지원
.NET Framework.NET Framework
WebServer
브라우저브라우저
World!World!ADO.NET ADO.NET / XML / XML / XML Schema/ XML Schema
HTML, XMLHTML, XML
OS
데이터 데이터 저장소저장소
HTTP HTTP HandlerHandler
/ASP.NET/ASP.NET
ADO.NETADO.NET
.NET .NET RMI / RMI / SOAPSOAP
컨텍스트컨텍스트
보안보안
트랜잭션트랜잭션
동시성동시성
ServicedServicedComponentComponent
ManagedManagedObjectObject
COM+ ServerCOM+ ServerCLRCLR
SOAP,XMLSOAP,XML
.NET vs. SQLXML.NET vs. SQLXML
.NET.NET XML-Object Mapping LayerXML-Object Mapping Layer
XML SerializationXML Serialization XML-Relation Mapping LayerXML-Relation Mapping Layer
ADO.NETADO.NET SQLXMLSQLXML
XML-Relation Mapping LayerXML-Relation Mapping Layer
XML vs RelationalXML vs Relational
Relational format : data Relational format : data storagestorage 각 각 entity entity 의 의 instanceinstance 는 는 rowrow 각 각 entityentity 의 의 propertyproperty 는 는 columncolumn RelationshipsRelationships 은 은 key fieldkey field 를 기반으로를 기반으로
XML : data XML : data exchangeexchange 각 각 entityentity 의 의 instanceinstance 는 는 elementelement 각 각 entityentity 의 의 PropertiesProperties 는 는 value, value,
attribute, attribute, 또는 또는 child elementchild element RelationshipsRelationships 은 계층적으로 묘사은 계층적으로 묘사
E-Commerce E-Commerce 시나리오시나리오
Retailer Shipper
Customer
Supplier
Purchase order
Catalog
Delivery requestExtranet
Web site
Intranet
Web site
SQLXMLSQLXML
RDBRDB 의 구조적 데이터를 의 구조적 데이터를 XMLXML 로 변환로 변환 XMLXML 을 을 RDBRDB 의 구조적 데이터로 변환의 구조적 데이터로 변환 XML-Relation Mapping LayerXML-Relation Mapping Layer
<XML>
XML business document,e.g., purchase order
Retailer Supplier
SQLXML ArchitectureSQLXML Architecture
IIS ISAPI
ADOHTTP
COM
AnnotatedSchemas
SQL ServerSQLOLEDB
Client Middle Tier SQL Server
Translation of: Updategrams Query templates XPath queries
SQL executed: Open XML T-SQL Update Insert Delete Select…For XML
Updategram
Query request
SQLXML ArchitectureSQLXML Architecture
SQLSQLXML XML 과 관련된 과 관련된 XMLXML기술기술 XML SchemaXML Schema XPath XPath XSLTXSLT
XML SchemaXML Schema
SchemaSchema 는 는 XML XML 문서의 규약을 동의문서의 규약을 동의 element, attribute element, attribute –– 데이터타입데이터타입 , , 순서순서 , ,
길이길이 , , 최대최대 // 최소값최소값
<XML>
XML business document,e.g., purchase order
Retailer Supplier
Schema
"urn:nwtraders""urn:nwtraders"
XPathXPath
XPath XPath 는 는 W3C XML Path LanguageW3C XML Path Language XPathXPath 를 이용 를 이용 XML XML 문서를 문서를
네비게이션네비게이션 ,, 검색검색 ,, 조작조작 XPathXPath 는 는 DOM, XQuery, DOM, XQuery,
XSL, XSLTXSL, XSLT 과 같이 사용됨과 같이 사용됨
<Plants xmlns="urn:nwtraders">
<?proc instr?> <!--comment-->
<ItemName code="123"> Clematis </ItemName>
</Plants>
<Plants xmlns="urn:nwtraders">
<?proc instr?> <!--comment-->
<ItemName code="123"> Clematis </ItemName>
</Plants> "123""123" "Clematis""Clematis"
RootRoot
"urn:nwtraders""urn:nwtraders"
"comment ""comment "
"proc-instr""proc-instr"
<ItemName><ItemName>
<Plants><Plants>
XPathXPath
XPath XPath 표준 표준 navigation languagenavigation language XML XML 계층구조로부터 계층구조로부터 XPathXPath 쿼리로 노드를 쿼리로 노드를
리턴리턴 모든 모든 OrderDetail OrderDetail 요소들요소들 ProductIDProductID 특성이 특성이 2323 인 인 OrderDetail OrderDetail
요소들요소들
Quantity Quantity 가 가 1 1 보다 큰 요소를 가진 보다 큰 요소를 가진 OrderDetail OrderDetail 요소요소
Order/OrderDetail[@ProductID='23']Order/OrderDetail[@ProductID='23']
Order/OrderDetail[Quantity > 1]Order/OrderDetail[Quantity > 1]
Order/OrderDetailOrder/OrderDetail
XSLTXSLT
XSLT XSLT 는 는 W3C XSL Transformations W3C XSL Transformations languagelanguage
XPathXPath 와 같이 사용와 같이 사용 XML vocabulariesXML vocabularies 와 포맷으로 변환하는데 사용와 포맷으로 변환하는데 사용
XML vocabulary 변환 XML 을 HTML 이나 text 로 변환
<Plant ID="3">Lemon</Plant><Plant ID="3">Lemon</Plant>
<Plant> <Name>Lemon</Name>
<SKU>3</SKU></Plant>
<Plant> <Name>Lemon</Name>
<SKU>3</SKU></Plant>
XMLXML HTMLHTML
XSLTXSLT
XSL XSL 스타일 시트를 적용시스타일 시트를 적용시 XMLXML 문서를 다른 포맷문서를 다른 포맷 (HTML)(HTML) 으로 변환으로 변환 XMLXML 문서를 또 다른 포맷문서를 또 다른 포맷 (XML,WML)(XML,WML) 으로 으로
변환변환
XML
XSL
XSLT & XPathXSLT & XPath
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/"> <xsl:apply-templates select="employees/employee">
<xsl:sort select="name" /> </xsl:apply-templates> </xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/"> <xsl:apply-templates select="employees/employee">
<xsl:sort select="name" /> </xsl:apply-templates> </xsl:template>
</xsl:stylesheet>
로트노트로 부터 employee name 을 리스트로트노트로 부터 employee name 을 리스트
XPath
루트노드루트노드
<employees> 밑의 <employee><employees> 밑의 <employee>
<name> 로 정렬<name> 로 정렬
SQL Server 2000SQL Server 2000 에서의 에서의 XML XML 지원지원 SQL Server SQL Server DataData 를 를 XMLXML 로 처리하는 방법로 처리하는 방법 Transact-SQLTransact-SQL XMLXML 을 이용한 을 이용한 SQLSQL Server Server Data Data 변경변경
XMLXML 을 처리하는 방법을 처리하는 방법 System.DataSystem.Data System.XmlSystem.Xml T-SQLT-SQL UpdateGram/Bulk LoadUpdateGram/Bulk Load SOAP/WSDLSOAP/WSDL SQLOLEDB/SQLXMLOLEDBSQLOLEDB/SQLXMLOLEDB Managed SQLXML ClassManaged SQLXML Class BiztalkBiztalk ……,,
Transact-SQLTransact-SQL
SELECT ... FOR XMLSELECT ... FOR XML 결과셋이 결과셋이 XML streamXML stream 으로 리턴으로 리턴 relational datarelational data 를 를 XMLXML 로 검색로 검색
OpenXMLOpenXML XML streamXML stream 을 을 rowsetrowset 으로 리턴으로 리턴 XML dataXML data 를 를 relational tablesrelational tables 로 로 InsertInsert
XMLXML 을 이용한 을 이용한 SQLSQL Server Server Data Data 변경변경 XML UpdategramsXML Updategrams
추가추가 ,, 수정수정 ,, 삭제시 삭제시 XML documentXML document 을 사용을 사용 XML Bulk Loader ComponentXML Bulk Loader Component
COM component COM component XML XML datadata 의 의 bulk-loadbulk-load 시 시
FOR XMLFOR XML
FOR XML FOR XML 구문구문
XML Document FragmentsXML Document Fragments
SELECT select_listFROM table_sourceWHERE search_conditionFOR XML RAW | AUTO | EXPLICIT [, XMLDATA] [, ELEMENTS] [, BINARY BASE64]
SELECT select_listFROM table_sourceWHERE search_conditionFOR XML RAW | AUTO | EXPLICIT [, XMLDATA] [, ELEMENTS] [, BINARY BASE64]
<Order OrderID="10248" OrderDate="07/04/1996"/><Order OrderID="10249" OrderDate="07/05/1996"/>
<Order OrderID="10248" OrderDate="07/04/1996"/><Order OrderID="10249" OrderDate="07/05/1996"/>
SQL Server SQL Server GenerateGenerate
ROWSET
TDS/Token XML
SELECT …FROM …WHERE …FOR XML MODE
SELECT …FROM …WHERE …FOR XML MODE
Query processor
ROWSET to XML
Using RAW ModeUsing RAW Mode
각각의 레코드에 하나의 각각의 레코드에 하나의 <row> element<row> element 각 컬럼은 각 컬럼은 attibuteattibute 로 처리로 처리
SELECT OrderID, OrderDateFROM OrdersFOR XML RAW
SELECT OrderID, OrderDateFROM OrdersFOR XML RAW
<row OrderID="10248" OrderDate="07/04/1996"/><row OrderID="10249" OrderDate="07/05/1996"/>
<row OrderID="10248" OrderDate="07/04/1996"/><row OrderID="10249" OrderDate="07/05/1996"/>
Using AUTO ModeUsing AUTO Mode
테이블 이름이 테이블 이름이 elementelement 의 이름의 이름 중첩을 지원중첩을 지원 , , 컬럼은 컬럼은 attributeattribute 로 처리로 처리 AliasAlias 로 이름 변경 가능로 이름 변경 가능
SELECT OrderID, OrderDateFROM OrdersFOR XML AUTO
SELECT OrderID, OrderDateFROM OrdersFOR XML AUTO
<Orders OrderID="10248" OrderDate="07/04/1996"/><Orders OrderID="10249" OrderDate="07/05/1996"/>
<Orders OrderID="10248" OrderDate="07/04/1996"/><Orders OrderID="10249" OrderDate="07/05/1996"/>
ELEMENTSELEMENTS
컬럼은 컬럼은 child elementchild element 로 처리로 처리
SELECT OrderID, OrderDateFROM OrdersFOR XML AUTO, ELEMENTS
SELECT OrderID, OrderDateFROM OrdersFOR XML AUTO, ELEMENTS
<Orders> <OrderID>10248</OrderID> <OrderDate>07/04/1996</OrderDate></Orders><Orders> <OrderID>10249</OrderID> <OrderDate>07/05/1996</OrderDate></Orders>
<Orders> <OrderID>10248</OrderID> <OrderDate>07/04/1996</OrderDate></Orders><Orders> <OrderID>10249</OrderID> <OrderDate>07/05/1996</OrderDate></Orders>
예예 ) Table) Table JoinJoinSELECT OrderForm.OrderID, Item.ProductID Item.QuantityFROM Orders OrderForm JOIN [Order Details] ItemON OrderForm.OrderID = Item.OrderIDORDER BY OrderForm.OrderIDFOR XML RAW
SELECT OrderForm.OrderID, Item.ProductID Item.QuantityFROM Orders OrderForm JOIN [Order Details] ItemON OrderForm.OrderID = Item.OrderIDORDER BY OrderForm.OrderIDFOR XML RAW
<row OrderID="10248" ProductID="1" Quantity="12"/><row OrderID="10248" ProductID="42" Quantity="10"/>
<row OrderID="10248" ProductID="1" Quantity="12"/><row OrderID="10248" ProductID="42" Quantity="10"/>
SELECT OrderForm.OrderID, Item.ProductID Item.QuantityFROM Orders OrderForm JOIN [Order Details] ItemON OrderForm.OrderID = Item.OrderIDORDER BY OrderForm.OrderIDFOR XML AUTO
SELECT OrderForm.OrderID, Item.ProductID Item.QuantityFROM Orders OrderForm JOIN [Order Details] ItemON OrderForm.OrderID = Item.OrderIDORDER BY OrderForm.OrderIDFOR XML AUTO
<OrderForm OrderID="10248"> <Item ProductID="1" Quantity="12"/> <Item ProductID="42" Quantity="10"/></OrderForm>
<OrderForm OrderID="10248"> <Item ProductID="1" Quantity="12"/> <Item ProductID="42" Quantity="10"/></OrderForm>
XMLDATAXMLDATA
XML-Data Reduced (XDR) SchemaXML-Data Reduced (XDR) Schema 로 로 리턴리턴
SELECT OrderID, OrderDateFROM OrdersFOR XML AUTO, XMLDATA
SELECT OrderID, OrderDateFROM OrdersFOR XML AUTO, XMLDATA
<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-
com:datatypes"><ElementType name="Orders" content="empty“
model="closed"><AttributeType name="OrderID" dt:type="14"/><AttributeType name="OrderDate" dt:type="dateTime"/><attribute type="OrderID"/><attribute type="OrderDate"/></ElementType></Schema>
<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-
com:datatypes"><ElementType name="Orders" content="empty“
model="closed"><AttributeType name="OrderID" dt:type="14"/><AttributeType name="OrderDate" dt:type="dateTime"/><attribute type="OrderID"/><attribute type="OrderDate"/></ElementType></Schema>
Binary DataBinary DataSELECT EmployeeID, PhotoFROM EmployeesWHERE EmployeeID = 10FOR XML AUTO
SELECT EmployeeID, PhotoFROM EmployeesWHERE EmployeeID = 10FOR XML AUTO
<Employees EmployeeID="1" Photo="dbObject/Employees[@EmpID='1']/@Photo"/>
<Employees EmployeeID="1" Photo="dbObject/Employees[@EmpID='1']/@Photo"/>
SELECT EmployeeID, PhotoFROM EmployeesWHERE EmployeeID = 1FOR XML AUTO, BINARY BASE64
SELECT EmployeeID, PhotoFROM EmployeesWHERE EmployeeID = 1FOR XML AUTO, BINARY BASE64
<Employees EmpID="1" Photo="FRwvAAIAAAANAA4AFAAhAP////9Ca ..."/>
<Employees EmpID="1" Photo="FRwvAAIAAAANAA4AFAAhAP////9Ca ..."/>
Using EXPLICIT ModeUsing EXPLICIT Mode
범용테이블을 만들기 위해 범용테이블을 만들기 위해 T-SQL T-SQL 작성작성 원하는 원하는 XMLXML 문서형태로 제어문서형태로 제어
SELECT 1 AS Tag, NULL AS Parent, OrderID AS [Invoice!1!InvoiceNo],
OrderDate AS [Invoice!1!Date!Element]FROM OrdersWHERE OrderID = 10248FOR XML EXPLICIT
SELECT 1 AS Tag, NULL AS Parent, OrderID AS [Invoice!1!InvoiceNo],
OrderDate AS [Invoice!1!Date!Element]FROM OrdersWHERE OrderID = 10248FOR XML EXPLICIT
<Invoice InvoiceNo="10248"> <Date>1996-07-04T00:00:00</Date></Invoice>
<Invoice InvoiceNo="10248"> <Date>1996-07-04T00:00:00</Date></Invoice>
범용 테이블범용 테이블 XML XML 문서의 특정형식문서의 특정형식 (( 행집합행집합 ))
Tag,Parent Tag,Parent 계층구조 결정계층구조 결정 ColumnColumn 이름은 이름은 element / attribute element / attribute 로 매핑로 매핑
TagTag ParentParent Invoice!1!Invoice!1!InvoiceNoInvoiceNo
Invoice!1!Date!Invoice!1!Date!ElementElement
LineItem!2!LineItem!2!ProductIDProductID
LineItem!2LineItem!2
11 NULLNULL 1024810248 1996-07-04T00:00:001996-07-04T00:00:00 NULLNULL NULLNULL
22 11 1024810248 NULLNULL 1111 Queso Queso CabralesCabrales
22 11 1024810248 NULLNULL 4242 Singaporean Singaporean ……
예예 ) EXPLICIT) EXPLICIT
UNION ALLUNION ALL 이용이용SELECT 1 AS Tag, NULL AS Parent, OrderID AS [Invoice!1!InvoiceNo], OrderDate AS [Invoice!1!Date!Element], NULL AS [LineItem!2!ProductID], NULL AS [LineItem!2]FROM OrdersWHERE OrderID=10248UNION ALLSELECT 2 AS Tag,1 AS Parent,
OD.OrderID,NULL,OD.ProductID,P.ProductName
FROM [Order Details] OD JOIN Orders O ON OD.OrderID=O.OrderIDJOIN Products P ON OD.ProductID = P.ProductIDWHERE OD.OrderID=10248ORDER BY [Invoice!1!InvoiceNo], [LineItem!2!ProductID]FOR XML EXPLICIT
SELECT 1 AS Tag, NULL AS Parent, OrderID AS [Invoice!1!InvoiceNo], OrderDate AS [Invoice!1!Date!Element], NULL AS [LineItem!2!ProductID], NULL AS [LineItem!2]FROM OrdersWHERE OrderID=10248UNION ALLSELECT 2 AS Tag,1 AS Parent,
OD.OrderID,NULL,OD.ProductID,P.ProductName
FROM [Order Details] OD JOIN Orders O ON OD.OrderID=O.OrderIDJOIN Products P ON OD.ProductID = P.ProductIDWHERE OD.OrderID=10248ORDER BY [Invoice!1!InvoiceNo], [LineItem!2!ProductID]FOR XML EXPLICIT
OPENXMLOPENXML
OPENXML syntaxOPENXML syntax RowRow 를 결정하기 위해 를 결정하기 위해 rowpattern rowpattern
parameter parameter 사용사용 컬럼을 결정하기 위해 컬럼을 결정하기 위해 WITH WITH
구문사용구문사용 AttributeAttribute 를 결정하기 위해 를 결정하기 위해 Flags Flags
parameter parameter 사용사용
SELECT * FROM OpenXML (@idoc, 'order', 1)WITH (orderno integer,
orderdate datetime)
SELECT * FROM OpenXML (@idoc, 'order', 1)WITH (orderno integer,
orderdate datetime)
OPENXML OPENXML 적용방법적용방법 sp_xml_preparedocumentsp_xml_preparedocument 으로 트리생성으로 트리생성 sp_xml_removedocumentsp_xml_removedocument 메모리 해제메모리 해제
CREATE PROC ProcessOrder @doc NTextASDECLARE @idoc integerEXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Process Document
EXEC sp_xml_removedocument @idoc
CREATE PROC ProcessOrder @doc NTextASDECLARE @idoc integerEXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Process Document
EXEC sp_xml_removedocument @idoc
예예 ) ) Inserting DataInserting Data
INSERT INSERT 구문구문
SELECT INTO SELECT INTO 구문구문
INSERT ordersSELECT * FROM OpenXML (@idoc, 'order', 1)WITH (orderno integer,
orderdate datetime)
INSERT ordersSELECT * FROM OpenXML (@idoc, 'order', 1)WITH (orderno integer,
orderdate datetime)
SELECT * INTO newordersFROM OpenXML (@idoc, 'order', 1)WITH (orderno integer,
orderdate datetime)
SELECT * INTO newordersFROM OpenXML (@idoc, 'order', 1)WITH (orderno integer,
orderdate datetime)
Using rowpatternUsing rowpattern
XpathXpath 를 사용를 사용
SELECT * FROM OpenXML (@idoc, 'order/lineitem', 1)WITH (productid integer,
quantity integer,price money)
SELECT * FROM OpenXML (@idoc, 'order/lineitem', 1)WITH (productid integer,
quantity integer,price money)
SELECT * FROM OpenXML (@idoc, 'order/lineitem[@quantity>2]', 1)WITH (productid integer,
quantity integer,price money)
SELECT * FROM OpenXML (@idoc, 'order/lineitem[@quantity>2]', 1)WITH (productid integer,
quantity integer,price money)
Using FlagsUsing Flags
attributes attributes 또는 또는 elements elements 지정하기 위해 사용지정하기 위해 사용 0 = default (attributes)0 = default (attributes) 1 = attributes1 = attributes 2 = elements2 = elements 3 = attributes elements (1 + 2)3 = attributes elements (1 + 2)
Using a Table NameUsing a Table Name
WITH WITH 구문에 테이블 이름 사용구문에 테이블 이름 사용 컬럼이름이 컬럼이름이 matchmatch 데이터 타입이 호환데이터 타입이 호환
INSERT lineitemsSELECT * FROM OpenXML (@idoc, 'order/lineitem', 3)WITH lineitems
INSERT lineitemsSELECT * FROM OpenXML (@idoc, 'order/lineitem', 3)WITH lineitems
Column PatternColumn Pattern
계층구조에서 데이터를 처리하기 위해 계층구조에서 데이터를 처리하기 위해 Xpath Xpath 사용사용
relative Xrelative XPPath ath 적용적용
INSERT lineitemsSELECT * FROM OpenXML (@idoc, 'order/lineitem', 1)WITH (orderno integer '../@orderno',
productid integer, --Default Mappingquantity integer './quantity',price money --Default Mapping)
INSERT lineitemsSELECT * FROM OpenXML (@idoc, 'order/lineitem', 1)WITH (orderno integer '../@orderno',
productid integer, --Default Mappingquantity integer './quantity',price money --Default Mapping)