XML과 SQL Server 2000에서 지원하는 XML 처리 방법 정 홍주 Web

Download Report

Transcript XML과 SQL Server 2000에서 지원하는 XML 처리 방법 정 홍주 Web

XML과 SQL Server 2000에서
지원하는 XML 처리 방법
정 홍주
WebTime
Feelanet
목차




.NET Framework
SQLXML
SQLXML 과 관련된 XML기술
SQL Server 2000에서의 XML 지원
.NET Framework
브라우저
데이터
저장소
ADO.NET
HTML, XML
Serviced
Component
SOAP,XMLHTTP
Handler
/ASP.NET
World!
Web
Server
보안
트랜잭션
Managed
Object
동시성
CLR
컨텍스트
OS
COM+ Server
.NET vs. SQLXML
 .NET
XML-Object Mapping Layer
 XML Serialization
 XML-Relation Mapping Layer
 ADO.NET
 SQLXML
 XML-Relation Mapping Layer

XML vs Relational
 Relational
format : data storage
 각 entity 의 instance는 row
 각 entity의 property는 column
 Relationships은 key field를 기반으로
 XML : data exchange
 각 entity의 instance는 element
 각 entity의 Properties는 value, attribute,
또는 child element
 Relationships은 계층적으로 묘사
E-Commerce 시나리오
Supplier
Extranet
Purchase order
Intranet
Delivery request
Catalog
Retailer
Web
site
Web
site
Customer
Shipper
SQLXML
RDB의 구조적 데이터를 XML로 변환
 XML을 RDB의 구조적 데이터로 변환
 XML-Relation Mapping Layer

<XML>
Retailer
XML business document,
e.g., purchase order
Supplier
SQLXML Architecture
Client
COM
Middle Tier
IIS ISAPI
SQL Server
SQLOLEDB
Translation of:
Updategram

Query
request


HTTP
ADO
SQL Server
Updategrams
Query templates
XPath queries
Annotated
Schemas
SQL executed:



Open XML
T-SQL
Update
Insert
Delete
Select…For XML
SQLXML Architecture
SQLXML 과 관련된 XML기술
 XML
Schema
 XPath
 XSLT
XML Schema
XML 문서의 규약을 동의
 element, attribute –데이터타입, 순서, 길이,
최대/최소값
 Schema는
Schema
<XML>
Retailer
XML business document,
e.g., purchase order
Supplier
XPath
는 W3C XML Path Language
 XPath를 이용 XML 문서를
Root
네비게이션,검색,조작
 XPath는 DOM, XQuery,
<Plants>
XSL, XSLT과 같이 사용됨
 XPath
<Plants
xmlns="urn:nwtraders">
<?proc instr?>
<!--comment-->
"urn:nwtraders"
"proc-instr"
"comment "
<ItemName>
<ItemName code="123">
Clematis
</ItemName>
</Plants>
"urn:nwtraders"
"123"
"Clematis"
XPath
표준 navigation language
 XML 계층구조로부터 XPath 쿼리로 노드를 리턴
Order/OrderDetail
 모든 OrderDetail 요소들
 ProductID 특성이 23인 OrderDetail 요소들
 XPath
Order/OrderDetail[@ProductID='23']

Quantity 가 1 보다 큰 요소를 가진
OrderDetail 요소
Order/OrderDetail[Quantity > 1]
XSLT
는 W3C XSL Transformations language
 XPath와 같이 사용
 XML vocabularies와 포맷으로 변환하는데 사용
 XSLT
<Plant ID="3">Lemon</Plant>
<Plant>
<Name>Lemon</Name>
<SKU>3</SKU>
</Plant>
XML vocabulary변환
XML
HTML
XML을 HTML이나 text로 변환
XSLT
스타일 시트를 적용시
 XML문서를 다른 포맷(HTML)으로 변환
 XML문서를 또 다른 포맷(XML,WML)으로 변환
 XSL
XML
XSL
XSLT & XPath
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/"> 루트노드
<xsl:apply-templates
select="employees/employee"> <employees>밑의 <employee>
<xsl:sort select="name" /> <name>로 정렬
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
XPath
로트노트로 부터 employee name을 리스트
SQL Server 2000에서의
XML 지원
Server Data를 XML로 처리하는 방법
 Transact-SQL
 XML을 이용한 SQL Server Data 변경
 SQL
XML을 처리하는 방법
 System.Data
 System.Xml
 T-SQL
 UpdateGram/Bulk
Load
 SOAP/WSDL
 SQLOLEDB/SQLXMLOLEDB
 Managed
 Biztalk
 …,
SQLXML Class
Transact-SQL
 SELECT
... FOR XML
 결과셋이 XML stream으로 리턴
 relational data를 XML로 검색
 OpenXML
 XML stream을 rowset으로 리턴
 XML data를 relational tables로 Insert
XML을 이용한 SQL Server
Data 변경
 XML
Updategrams
 추가,수정,삭제시 XML document을 사용
 XML Bulk Loader Component
 COM component
 XML data의 bulk-load시
FOR XML
 FOR
XML 구문
SELECT select_list
FROM table_source
WHERE search_condition
FOR XML RAW | AUTO | EXPLICIT
[, XMLDATA] [, ELEMENTS] [, BINARY BASE64]
 XML
Document Fragments
<Order OrderID="10248" OrderDate="07/04/1996"/>
<Order OrderID="10249" OrderDate="07/05/1996"/>
SQL Server Generate
SELECT …
FROM …
WHERE …
FOR XML MODE
Query processor
ROWSET
ROWSET to XML
TDS/
Token XML
Using RAW Mode
 각각의
레코드에 하나의 <row> element
 각 컬럼은 attibute로 처리
SELECT OrderID, OrderDate
FROM Orders
FOR XML RAW
<row OrderID="10248" OrderDate="07/04/1996"/>
<row OrderID="10249" OrderDate="07/05/1996"/>
Using AUTO Mode
 테이블
이름이 element의 이름
 중첩을 지원, 컬럼은 attribute로 처리
 Alias로 이름 변경 가능
SELECT OrderID, OrderDate
FROM Orders
FOR XML AUTO
<Orders OrderID="10248" OrderDate="07/04/1996"/>
<Orders OrderID="10249" OrderDate="07/05/1996"/>
ELEMENTS
 컬럼은
child element로 처리
SELECT OrderID, OrderDate
FROM Orders
FOR XML AUTO, ELEMENTS
<Orders>
<OrderID>10248</OrderID>
<OrderDate>07/04/1996</OrderDate>
</Orders>
<Orders>
<OrderID>10249</OrderID>
<OrderDate>07/05/1996</OrderDate>
</Orders>
예) Table Join
SELECT OrderForm.OrderID, Item.ProductID Item.Quantity
FROM Orders OrderForm JOIN [Order Details] Item
ON OrderForm.OrderID = Item.OrderID
ORDER BY OrderForm.OrderID
FOR XML RAW
<row OrderID="10248" ProductID="1" Quantity="12"/>
<row OrderID="10248" ProductID="42"
Quantity="10"/>
SELECT OrderForm.OrderID, Item.ProductID Item.Quantity
FROM Orders OrderForm JOIN [Order Details] Item
ON OrderForm.OrderID = Item.OrderID
ORDER BY OrderForm.OrderID
FOR XML AUTO
<OrderForm OrderID="10248">
<Item ProductID="1" Quantity="12"/>
<Item ProductID="42" Quantity="10"/>
</OrderForm>
XMLDATA
 XML-Data
Reduced (XDR) Schema로
리턴
SELECT OrderID, OrderDate
FROM Orders
FOR XML AUTO, XMLDATA
<Schema name="Schema1"
xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoftcom: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 Data
SELECT EmployeeID, Photo
FROM Employees
WHERE EmployeeID = 10
FOR XML AUTO
<Employees EmployeeID="1"
Photo="dbObject/Employees[@EmpID='1']/@Photo"/>
SELECT EmployeeID, Photo
FROM Employees
WHERE EmployeeID = 1
FOR XML AUTO, BINARY BASE64
<Employees EmpID="1"
Photo="FRwvAAIAAAANAA4AFAAhAP////9Ca ..."/>
Using EXPLICIT Mode
 범용테이블을
만들기 위해 T-SQL 작성
 원하는 XML 문서형태로 제어
SELECT 1 AS Tag, NULL AS Parent,
OrderID AS [Invoice!1!InvoiceNo],
OrderDate AS [Invoice!1!Date!Element]
FROM Orders
WHERE OrderID = 10248
FOR XML EXPLICIT
<Invoice InvoiceNo="10248">
<Date>1996-07-04T00:00:00</Date>
</Invoice>
범용 테이블
문서의 특정형식(행집합)
 Tag,Parent 계층구조 결정
 Column이름은 element / attribute 로 매핑
 XML
Tag
Parent
Invoice!1!
InvoiceNo
Invoice!1!Date!
Element
LineItem!2!
ProductID
LineItem!2
1
NULL
10248
1996-07-04T00:00:00 NULL
NULL
2
1
10248
NULL
11
Queso
Cabrales
2
1
10248
NULL
42
Singaporean
…
예) EXPLICIT
 UNION
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 Orders
WHERE OrderID=10248
UNION ALL
SELECT 2 AS Tag,1 AS Parent,
OD.OrderID,
NULL,
OD.ProductID,
P.ProductName
FROM [Order Details] OD JOIN Orders O ON OD.OrderID=O.OrderID
JOIN Products P ON OD.ProductID = P.ProductID
WHERE OD.OrderID=10248
ORDER BY [Invoice!1!InvoiceNo], [LineItem!2!ProductID]
FOR XML EXPLICIT
OPENXML
 OPENXML
syntax
 Row를 결정하기 위해 rowpattern
parameter 사용
 컬럼을 결정하기 위해 WITH 구문사용
 Attribute를 결정하기 위해 Flags
parameter 사용
SELECT * FROM OpenXML (@idoc, 'order', 1)
WITH (orderno integer,
orderdate datetime)
OPENXML 적용방법
트리생성
 sp_xml_removedocument 메모리 해제
 sp_xml_preparedocument으로
CREATE PROC ProcessOrder @doc NText
AS
DECLARE @idoc integer
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Process Document
EXEC sp_xml_removedocument @idoc
예) Inserting Data
 INSERT
구문
INSERT orders
SELECT * FROM OpenXML (@idoc, 'order', 1)
WITH (orderno integer,
orderdate datetime)
 SELECT
INTO 구문
SELECT * INTO neworders
FROM OpenXML (@idoc, 'order', 1)
WITH (orderno integer,
orderdate datetime)
Using rowpattern
 Xpath를
사용
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)
Using Flags
또는 elements 지정하기 위해 사용
 0 = default (attributes)
 1 = attributes
 2 = elements
 3 = attributes elements (1 + 2)
 attributes
Using a Table Name
구문에 테이블 이름 사용
 컬럼이름이 match
 데이터 타입이 호환
 WITH
INSERT lineitems
SELECT * FROM OpenXML (@idoc, 'order/lineitem', 3)
WITH lineitems
Column Pattern
 계층구조에서
데이터를 처리하기 위해
Xpath 사용
 relative XPath 적용
INSERT lineitems
SELECT * FROM OpenXML (@idoc, 'order/lineitem', 1)
WITH (orderno integer '../@orderno',
productid integer, --Default Mapping
quantity integer './quantity',
price money --Default Mapping)