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)