130 likes | 320 Views
Модуль 3. Работа с XML. Модуль 3: Работа с XML. Использование типа данных XML Извлечение XML-данных с помощью предложения FOR XML Дробление XML-данных с помощью функции OPENXML. Тип данных XML. Системный тип данных для XML. Позволяет хранить XML документы и фрагменты.
E N D
Модуль 3 Работа с XML
Модуль 3: Работа с XML Использование типа данных XML Извлечение XML-данных с помощью предложения FOR XML Дробление XML-данных с помощью функции OPENXML
Тип данных XML • Системный тип данных дляXML • Позволяет хранитьXML документы и фрагменты • Используется для таблиц, переменных или параметров • Предоставляет методы для запросов и измененияXML -- usage within table definition CREATE TABLE NewTable ( Col1 int primary key, Col2 xml ) -- usage as local variable declare @data xml -- usage as parameter to stored procedure CREATE PROCEDURE SaveData(@doc xml) AS ...
Методы Query, Value, Exist, Modify и Nodes • Queryвозвращает нетипизированныйXML • Valueвозвращает скалярное значение • Existпроверяет существование значения • Modifyдобавляет, изменяет и удаляет узлы в XML документе • Nodesдробит xml переменную в реляционные данные SELECT nCol.value('../@OrderID[1]', 'int') ID, nCol.value('@ProductID[1]', 'int') Prod FROM Orders CROSS APPLY OrderDoc.nodes('/Order/LineItem') AS nTable(nCol)
Модуль 3: Работа с XML Использование типа данных XML Извлечение XML-данных с помощью предложения FOR XML Дробление XML-данных с помощью функции OPENXML
Режим запроса RAW • XML представление набора строк • Содержит либо элементы, либо атрибуты • Опционально корневого элемента и имени элемента строки SELECT Cust.CustomerID CustID, CustomerType, SalesOrderID FROM Customer Cust JOIN SalesOrderHeader [Order] ON Cust.CustomerID = [Order].CustomerID ORDER BY Cust.CustomerID FOR XML RAW SELECT Cust.CustomerID CustID, CustomerType, SalesOrderID FROM Customer Cust JOIN SalesOrderHeader [Order] ON Cust.CustomerID = [Order].CustomerID ORDER BY Cust.CustomerID FOR XML RAW, ELEMENTS SELECT Cust.CustomerIDCustID, CustomerType, SalesOrderID FROM Customer Cust JOIN SalesOrderHeader [Order] ON Cust.CustomerID = [Order].CustomerID ORDER BY Cust.CustomerID FOR XML RAW('Order'), ROOT('Orders') <row CustID="1" CustomerType="S" SalesOrderID="43860"/> <row CustID="1" CustomerType="S" SalesOrderID="44501"/> ... <row> <CustID>1</CustID> <CustomerType>S</CustomerType> <SalesOrderID>43860</SalesOrderID> </row>... <Orders> <Order><CustID>1</CustID><CustomerType>S</... </Order> ... </Orders>
Режим запроса AUTO XML представление объектов данных SELECT Cust.CustomerID, OrderHeader.CustomerID, OrderHeader.SalesOrderID, OrderHeader.Status, Cust.CustomerType FROM Sales.CustomerCust, Sales.SalesOrderHeaderOrderHeader WHERE Cust.CustomerID = OrderHeader.CustomerID ORDER BY Cust.CustomerID FOR XML AUTO <CustCustomerID="1" CustomerType="S"> <OrderHeaderCustomerID="1" SalesOrderID="43860" Status="5" /> <OrderHeaderCustomerID="1" SalesOrderID="44501" Status="5" /> <OrderHeaderCustomerID="1" SalesOrderID="45283" Status="5" /> <OrderHeaderCustomerID="1" SalesOrderID="46042" Status="5" /> </Cust> ...
Режим запроса EXPLICIT • Табличное представлениеXML документа • Допускает полный контроль форматаXML SELECT 1 AS Tag, NULL AS Parent, SalesOrderID AS [Invoice!1!InvoiceNo], OrderDate AS [Invoice!1!Date!Element] FROM SalesOrderHeader FOR XML EXPLICIT SELECT 1 AS Tag, NULL AS Parent, SalesOrderID AS [Invoice!1!InvoiceNo], OrderDate AS [Invoice!1!Date!Element] FROM SalesOrderHeader FOR XML EXPLICIT Атрибут <Invoice InvoiceNo="43659"> <Date>2001-07-01T00:00:00</Date> </Invoice> <Invoice InvoiceNo="43660">... <Invoice InvoiceNo="43659"> <Date>2001-07-01T00:00:00</Date> </Invoice> <Invoice InvoiceNo="43660">... Элемент
Режим запроса PATH • ПрименениеXML Path Language (XPath) для задания формата XML • Возможно создание вложенных данных • Легче в использовании, чемрежим EXPLICIT SELECT EmployeeID "@EmpID", FirstName "EmpName/First", LastName "EmpName/Last" FROM Person.Contact INNER JOIN Employee ON Person.Contact.ContactID = Employee.ContactID FOR XML PATH <row EmpID="1"> <EmpName> <First>Guy</First> <Last>Gilbert</Last> </EmpName> </row> ...
Извлечение вложенных XML–данных • В режиме AUTO только атрибуты или элементы • Внутренний запросFOR XML с параметромTYPE для возвращенияданных типа xml • РежимEXPLICIT с выражениемUNION ALL SELECT 1 AS Tag, NULL AS Parent, ... FROM SalesOrderHeader UNION ALL SELECT 2 AS Tag, 1 AS Parent, ... FROM SalesOrderDetail OD JOIN ... FOR XML EXPLICIT <Invoice InvoiceNo="43659"> <Date>2001-07-01T00:00:00</Date> <LineItem ProductID="709">Bike Socks, M</LineItem> <LineItem ProductID="711">Helmet, Blue</LineItem> </Invoice>...
Модуль 3: Работа с XML Использование типа данных XML Извлечение XML-данных с помощью предложения FOR XML Дробление XML-данных с помощью функции OPENXML
Создание представления внутреннего дерева с помощью sp_xml_preparedocument 2 Извлечение набора строк с помощью OPENXML 3 Дробление данных в таблицы 4 Обзор процедуры дробления данных Получение документа XML 1 Очистка памяти с помощью sp_xml_removedocument 5
Синтаксис функции OPENXML ColPatternопределяетSalesOrderID, Status иOrderDate <Customer CustomerID="1" CustomerType="S"> <Order SalesOrderID="43860" Status="5" OrderDate="2001-08-01T00:00:00"> <OrderDetail ProductID="761" Quantity="2"/> <OrderDetail ProductID="770" Quantity="1"/> </Order> </Customer> По умолчанию атрибуты rowpatternопределяет уровень узлов SELECT * FROM OPENXML (@idoc, '/Customer/Order/OrderDetail', 1) WITH (CustomerID int '../../@CustomerID', OrderID int '../@SalesOrderID', OrderDate datetime '../@OrderDate', ProdID int '@ProductID', Quantity int) Из элемента Customer Из элемента Order Значение по умолчанию для атрибута Quantity Из элемента OrderDetail