|
Программирование >> Программирование баз данных
NULL as [soh!21SalesOrderlD], NULL as [soh!2lOrderDate] FROM Person.Contact с WHERE e.ContactID = 1 OR e.ContactID = 2 UNION ALL SELECT 2, 1, с.ContactID, с.LastName, с.FirstName, soh.SalesOrderlD, soh.OrderDate FROM Person.Contact с JOIN Sales.SalesOrderHeader soh ON e.ContactID = soh.ContactID WHERE e.ContactID = 1 OR e.ContactID = 2 ORDER BY [e!1IContactlD], [soh121SalesOrderlD] FOR XML EXPLICIT Обратите внимание на то, что конструкция FOR XML применяется только один раз, после последней операции выборки в соединении UNION. Следует еще раз отметить, что такое усложнение неоправдано. Очевидно, что в данном случае запрос становится гораздо сложнее, чем при использовании других опций, но достаточно лишь внести несколько изменений, и появляется возможность сформировать с помощью запроса с опцией EXPLICIT такие конструкции XML, которые не могут быть получены с помощью опции AUTO. В качестве довольно простой иллюстрации рассмотрим следующий пример, в котором внесено несколько небольших изменений в требования к формируемому запросу. Допустим, что решено выразить информацию о фамилии, LastName, в ввде атрибута элемента soli, а не элемента с (еще одна возможность состоит в том, чтобы представить эту информацию и так, и иначе). При использовании опции AUTO для решения указанной задачи потребовалось бы применить некоторые сложные конструкции (в ходе обработки каждой строки приходилось бы снова и снова выполнять поиск значения Contact с помощью связанного подзапроса, поскольку опция AUTO не позволяет использовать одно и то же значение в нескольких местах). А если применяются дополнительные операции поиска, то код становится очень сложным. В действительности может оказаться, что из-за усложнения кода вообще не удастся решить поставленную задачу. С другой стороны, с помощью опции EXPLICIT все подобные задачи решаются относительно просто (по крайней мере, ненамного сложнее по сравнению со всеми прочими вариантами применения этой опции). Для решения указанной задачи с применением опции EXPLICIT достаточно лишь снова получить ссылку на столбец LastName в списке выборки, но связать новый экземпляр этого объекта с элементом soli, а не с элементом с: USE AdventureWorks SELECT 1 as Tag, NULL as Parent, e.ContactID as [e11!ContactID] , c.LastName as [c!1!LastName], c.FirstName as [c11!FirstName] , NULL as [soh!2!SalesOrderlD], NULL as [soh!2!OrderDate], NULL as [soh!2LastName] FROM Person.Contact с WHERE e.ContactID = 1 OR e.ContactID = 2 UNION ALL SELECT 2, 1, с.ContactID, с.LastName, с.FirstName, soh.SalesOrderlD, soh.OrderDate, soh.OrderDate, с.LastName FROM Person.Contact с JOIN Sales.SalesOrderHeader soh ON e.ContactID = soh.ContactID WHERE e.ContactID = 1 OR e.ContactID = 2 ORDER BY [c!l!ContactID], [soh!2!SalesOrderlD] FOR XML EXPLICIT После вызова на выполнение этого запроса формируются в основном такие же результаты, как и прежде, но на этот раз в элементе soli появляется искомый дополнительный атрибут: <с ContactID= l LastName= Aehong FirstName= Gustavo > <soh SalesOrderID= 44132 OrderDate= 2001-09-01T00:00:00 LastName= Aehong /> <soh SalesOrderID= 45579 OrderDate= 2002-03-01T00:00:00 LastName= Aehong /> <soh SalesOrderID= 46389 OrderDate= 2002-06-01T00:00:00 LastName= Aehong /> <soh SalesOrderID= 47454 OrderDate= 2002-09-01T00:00:00 LastName= Aehong /> <soh SalesOrderID= 48395 OrderDate= 2002-12-01T00:00:00 LastName= Aehong /> <soh SalesOrderID= 49495 OrderDate= 2003-03-01T00:00:00 LastName= Aehong /> <soh SalesOrderID= 50756 OrderDate= 2003-06-01T00:00:00 LastName= Aehong /> </c> <c ContactID= 2 LastName= Abel FirstName= Catherine > <soh SalesOrderID= 53459 OrderDate= 2003-09-01T00:00:00 LastName= Abel /> <soh SalesOrderID= 58907 OrderDate= 2003-12-01T00:00:00 LastName= Abel /> <soh SalesOrderID= 65157 OrderDate= 2004-03-01T00:00:00 LastName= Abel /> <soh SalesOrderID= 71782 OrderDate= 2004-06-01T00:00:00 LastName= Abel /> </c> Данный пример демонстрирует лишь самые основные возможности. А для реализации гораздо более сложных функциональных средств могут использоваться директивы, которые позволяют формировать и управлять выводом не только данных, но и информации о схеме (если применяется опция xmldata). На первых порах для освоения директив требуются значительные усилия. Но после того как вы научитесь работать с директивами, вскоре обнаружится, что способы их применения не такие уж сложные, хотя в отдельных случаях конструкции, в которых используются директивы, все же могут показаться запутанными (действия, осу-ш;ествляемые с помощью некоторых директив, не очевидны на первый взгляд, кроме того, иногда зависят от определенных дополнительных факторов). По мнению автора (а также представителей одного известного ему коллектива разработчиков, которые думают так же, но никогда в этом не признаются), решение корпорации Microsoft о вводе в действие директив было принято несмотря на то, что с их применением связаны значительные трудности, поскольку перспективы организации работы с помощью директив слишком привлекательны, чтобы от них можно было отказаться. Вообще говоря, предусмотрена возможность использовать с опциями EXPLICIT восемь директив. Некоторые из этих директив могут применяться совместно на одном и том же уровне иерархии, а применение других исключает возможность использования определенной части директив на каком-то конкретном уровне иерархии. Назначение директив состоит в том, что они позволяют модифицировать формат представления результатов. Если бы не было возможности вводить директивы в код операторов, то применение опции EXPLICIT имело бы мало смысла или вообще было бы бессмысленным (опция AUTO позволяет выполнить основную часть тех же операций форматирования данных, что и опция EXPLICIT, особенно если в сочетании с опцией EXPLICIT не используются директивы, даже несмотря на то, что, как уже было сказано выше, иногда для этого приходится применять довольно сложные конструкции с опцией AUTO). Итак, учитывая сделанные здесь замечания, рассмотрим, какие директивы являются доступными. Директива element Понять назначение директивы element можно, по-видимому, гораздо проще по сравнению со всеми остальными. Назначение этой директивы сводится лишь к тому, что она указывает на необходимость оформить значения в рассматриваемом столбце в виде элементов, а не атрибутов. Содержимое созданного элемента вводится в структуру документа XML в виде дескриптора, дочернего по отношению к текущему дескриптору. Например, предположим, что условия предыдущих примеров были уточнены таким образом, чтобы значение OrderDate было представлено в виде отдельного элемента. Эту задачу можно решить путем добавления директивы element к концу определения поля OrderDate: USE AdventureWorks SELECT 1 as Tag, NULL as Parent, e.ContactID as [c!1!ContactID], c.LastName as [c!1!LastName], c.FirstName as [c!1!FirstName], NULL as [soh!2!SalesOrderlD], NULL as [soh!2lOrderDate!element] FROM Person.Contact с WHERE e.ContactID = 1 OR e.ContactID = 2 UNION ALL SELECT 2, 1, с.ContactID, с.LastName, e.FirstName, soh.SalesOrderlD, soh.OrderDate FROM Person.Contact с JOIN Sales.SalesOrderHeader soh ON e.ContactID = soh.ContactID WHERE e.ContactID = 1 OR e.ContactID = 2 OiyDER BY [cH !ContactID] , [soh! 2 ! SalesOrderlD] FOR XML EXPLICIT Этого вполне достаточно, чтобы получить дополнительный элемент вместо атрибута: <е ContaetID= l LastName= Achong FirstName= Gustavo > <soh SalesOrderID= 44132 > <OrderDate>2001-09-01T00:00:00</OrderDate> </soh> <soh SalesOrderID= 45579 >
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |