Дополнительную информацию о режиме EXPLICIT универсальных таблицах см. “Using EXPLICIT Mode” в SQL Server Books Online.
Запросы в режиме PATH
Введение
Режим PATH позволяет получить настроенный XML-документ при использовании синтаксиса XPath, чтобы значения соответствовали атрибутам, элементам, подэлементам, текстовым узлам и значениям данных. Эта способность соотнести столбцы таблиц с узлами XML-документа позволяют получить сложный XML без сложности запроса в режиме EXPLICIT.
Рассмотрите следующие особенности синтаксиса XPath:
■ XML узлы в дереве выражаются как пути, отделенные символами /.
■ Атрибуты обозначаются символами @ в начале имени атрибута.
■ Для обозначения относительных путей можно использовать одну точку (.), чтобы представить текущий узел и две точки (..), чтобы представить родителя текущего узла.
Получение данных при использовании режима PATH
Следующий пример показывает, как Вы можете использовать запрос в режиме PATH, чтобы возвратить XML фрагмент, содержащий список служащих.
SELECT EmployeeID "@EmpID",
FirstName "EmpName/First",
LastName "EmpName/Last"
FROM Person.Contact INNER JOIN
Employee ON Person.Contact.ContactID = Employee.ContactID
FOR XML PATH
Этот запрос позволяет получить фрагмент XML в формате, показанном в следующем примере.
<row EmpID="1">
<EmpName>
<First>Guy</First>
<Last>Gilbert</Last>
</EmpName>
</row>
<row EmpID="2">
<EmpName>
<First>Kevin</First>
<Last>Browne</Last>
</EmpName>
</row>
Заметьте, что столбец EmployeeID соответствует атрибуту EmpID со знаком @. Столбцы FirstName и LastName соответствуют подэлементам элемента EmpName.
Изменение имени элемента row
Следующий пример показывает, как Вы можете использовать дополнительный аргумент ElementName режима PATH, чтобы изменить название элемента строки, принятого по умолчанию.
SELECT EmployeeID "@EmpID",
FirstName "EmpName/First",
LastName "EmpName/Last"
FROM Person.Contact INNER JOIN
Employee ON Person.Contact.ContactID = Employee.ContactID
FOR XML PATH('Employee')
Этот запрос позволяет получить фрагмент XML в формате, показанном в следующем примере.
<Employee EmpID="1">
<EmpName>
<First>Guy</First>
<Last>Gilbert</Last>
</EmpName>
</Employee>
<Employee EmpID="2">
<EmpName>
<First>Kevin</First>
<Last>Browne</Last>
</EmpName>
</Employee>
Заметьте, что столбец EmployeeIDсоответствует атрибуту EmpID (@EmpID), а столбцы FirstNameи LastNameсоответствуют подэлементам элемента EmpName(EmpName/Firstи EmpName/Last).
Синтаксис для получения вложенных XML-документов
Введение
Вложение XML позволяет Вам представить отношение родитель/потомок как иерархию XML — например, клиенты и их заказы, или заказы и их пункты. Есть несколько способов вложения элементов XML при использовании фразы FOR XML, включая:
■ Определение соединений в запросах режима AUTO
■ Определение опции TYPE в подзапросах, чтобы получить значения типа xml
■ Объединение множества универсальных таблиц при использовании UNION ALL в запросах в режиме EXPLICIT
Использование режима AUTO для получения вложенных XML
Когда Вы определяете JOIN в запросе в режиме AUTO, SQL Server вкладывает получающиеся элементы, которые соответствуют таблицам в том порядке, в котором они появляются во фразе SELECT.
Режим AUTO позволяет определить, соответствуют ли столбцы элементам или атрибутам во XML фрагменте при использовании опции ELEMENTS. Однако, Вы можете определить только одну опцию для всего фрагмента, обеспечивая ограниченный контроль над форматом вывода.
В следующем примере все столбцы выведены как атрибуты, потому что не определена опция ELEMENTS.
FROM Sales.Customer Cust JOIN Sales.SalesOrderHeader [Order]
ON Cust.CustomerID = [Order].CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO
Этот запрос позволяет получить фрагмент XML в формате, показанном в следующем примере.
<Cust CustID="1" CustomerType="S">
<Order SalesOrderID="43860"/>
<Order SalesOrderID="44501"/>
</Cust>
Добавление опции ELEMENTS к предыдущему оператору Transact-SQL позволило бы вывести следующий документ.
<Cust>
<CustID>1</CustID>
<CustomerType>S</CustomerType>
<Order>
<SalesOrderID>43860</SalesOrderID>
</Order>
<Order>
<SalesOrderID>44501</SalesOrderID>
</Order>
</Cust>
...
Использование TYPE для получения типа данных xml в подзапросе
SQL Server 2005 включает тип данныхxml. Определение директивы TYPE в запросе FOR XML возвращает результаты как xmlзначение вместо строки типа varchar. Наиболее существенное воздействие этого - способность вложения запросов FOR XML, чтобы получить многоуровневый XML в запросах в режимах AUTO и RAW. Следующий пример показывает, как использовать директиву TYPE, чтобы вкладывать запросы FOR XML.
SELECT Name CategoryName,
(SELECT Name SubCategoryName
FROM Production.ProductSubCategory SubCategory
WHERE SubCategory.ProductCategoryID=Category.ProductCategoryID
FOR XML AUTO, TYPE, ELEMENTS)
FROM Production.ProductCategory Category
FOR XML AUTO
Результат предыдущего запроса показывается в этом примере.
<Category CategoryName="Accessories">
<SubCategory>
<SubCategoryName>Bike Racks</SubCategoryName>
</SubCategory>
<SubCategory>
<SubCategoryName>Bike Stands</SubCategoryName>
</SubCategory>
</Category>
...
Иначе, если бы внешний запрос не содержал фразы FOR XML AUTO, в выводе появился бы столбец с подкатегориями, содержащий xml данные.
Столбец с xmlданными не имеет имени, потому что запрос не определяет псевдоним для внутреннего SELECT.
Дополнительная информация.Дополнительную информацию об использовании директивы TYPE, см. “TYPE Directive in FOR XML Queries” в SQL Server Books Online.
Вложение таблиц при использовании режима EXPLICIT
Чтобы использовать режим EXPLICIT для получения XML документа, содержащего множество тегов, Вы должны написать индивидуальные запросы для каждого тега и затем слить их при использовании оператора UNION ALL.
Рассмотрите следующие требования использования оператора UNION ALL в запросах режима EXPLICIT:
■ Чтобы результаты объединения были успешны, каждый запрос должен возвратить согласованное множество столбцов. Вы можете назначить Null-значения столбцам, не используемым в текущем запросе.
■ Вы должны использовать фразу ORDER BY, чтобы слить результаты в правильной XML иерархии.
Например, XML документ-счет мог бы потребовать следующего формата.
Поскольку этот формат содержит два элемента XML (Invoiceи LineItem), которые соответствуют таблицам или представлениям, Вы должны использовать два запроса, чтобы получить данные. Первый запрос должен произвести элемент Invoice, который содержит атрибут InvoiceNoи дочерний элемент Date. Поскольку запрос будет объединен с другим запросом с использованием оператора UNION ALL, Вы должны также определить столбцы для ProductIDи Name, которые возвращаются в другом запросе.
Второй запрос должен получить подэлементы LineItemвнутри элемента Invoice. Они содержат ProductIDи Name, назначенное как значение элемента LineItem. Вы должны также получить OrderID,чтобысоединить пункты с их заказами.
Следующий пример показывает, как нужно объединить два запроса при использовании оператора UNION, чтобы получить элементы Invoiceи LineItem, чтобы получить предыдущий XML-документ.
SELECT 1 AS Tag,
NULL AS Parent,
SalesOrderID AS [Invoice!1!InvoiceNo],
OrderDate AS [Invoice!1!Date!Element],
NULL AS [LineItem!2!ProductID],
NULL AS [LineItem!2]
FROM Sales.SalesOrderHeader
UNION ALL
SELECT 2 AS Tag, 21
1 AS Parent,
OrderDetail.SalesOrderID,
NULL,
OrderDetail.ProductID,
Product.Name
FROM Sales.SalesOrderDetail OrderDetail JOIN
Sales.SalesOrderHeader OrderHeader
ON OrderDetail.SalesOrderID= OrderHeader.SalesOrderID
JOIN Production.Product Product
ON OrderDetail.ProductID = Product.ProductID
ORDER BY [Invoice!1!InvoiceNo], [LineItem!2!ProductID]
FOR XML EXPLICIT
Лекция 4 Разбор документов XML с использованием синтаксиса OPENXML
Введение
Набор строк содержит результат запроса в виде таблицы. В сценарии для обмена данными с торговым партнером, Вы, возможно, должны будете сгенерировать набор строк из документа XML. Например, розничный продавец мог бы послать заказы поставщику как документы XML. Поставщик должен тогда сгенерировать набор строк из XML-документа, чтобы вставить данные в одну или более таблиц в базе данных. Процесс преобразования данных XML в набор строк известен как "разбор" данных XML.
Из этого урока Вы узнаете, как разобрать XML-документ с использованием функции OPENXML и соответствующих хранимых процедур.
Порядок разбора данных XML
Преобразование данных XML в набор строк включает следующие пять шагов:
1. Получите документ XML.Когда приложение получает документ XML, возможна обработка документа при использовании кода Transact-SQL. Например, когда поставщик получает заказ XML от розничного продавца, поставщик регистрирует заказ в базе данных SQL Server. Чтобы обработать данные XML, обычно выполняется код Transact-SQL в форме хранимой процедуры, где строка XML передается как параметр.
2. Сгенерируйте внутреннее представление дерева.Используйте хранимую процедуруsp_xml_preparedocument, чтобы разобрать документ XML и преобразовать его в памяти в древовидную структуру прежде, чем обработать документ. Дерево концептуально подобно представлению документа XML согласно Data Object Document (DOM). Вы можете использовать только правильно построенный документ XML, чтобы сгенерировать внутреннее дерево.
3. Сформируйте набор строк из дерева.Вы используете функцию OPENXML, чтобы сгенерировать в памяти набор строк из данных в дереве. Используйте синтаксис запросов XPath, чтобы определить узлы дерева, которые будут возвращаться в наборе строк.
4. Обработайте данные набора строк.Используйте набор строк, созданный OPENXML, для обработки данных любыми средствами, применяемыми для наборов строк. Вы можете выбирать, обновлять или удалять данные, используя операторы Transact-SQL. Обычно OPENXML используется для вставки данных в постоянные таблицы базы данных. Например, заказ XML, полученный поставщиком, мог бы содержать данные, которые должны быть вставлены в таблицы SalesOrderHeaderи SalesOrderDetail.
5. Удалите внутреннее дерево. Когда дерево больше не требуется, используйте для освобождения памяти хранимую процедуру sp_xml_removedocument.