|
Программирование >> Программирование баз данных
RAW. Ключевое слово RAW указывает, что каждая строка данных в результирующем наборе должна быть возвращена как один элемент данных. Элемент получает имя row , а каждое поле строки оформляется в виде атрибута элемента row . Даже в случае соединения нескольких таблиц с помощью опции RAW вывод результатов производится с таким же количеством элементов, которое соответствует количеству строк, возвращенных обычным запросом SQL. AUTO. При использовании опции AUTO каждый элемент получает обозначение, взятое либо из имени таблицы, либо из псевдонима имени таблицы, которая является источником данных. Если в результате запроса формируются данные, полученные больше чем из одной таблицы, то данные из каждой таблицы разбиваются на отдельные вложенные элементы. Кроме того, при использовании опции AUTO поддерживается также дополнительная опция ELEMENTS, позволяющая указать, что данные полей должны быть представлены в виде элементов, а не атрибутов. EXPLICIT. Безусловно, опция EXPLICIT требует применения наиболее сложных синтаксических конструкций при оформлении запроса, но в конечном итоге позволяет получить наибольший контроль над тем, как будут выглядеть данные в коде XML. Кроме того, опция EXPLICIT позволяет отчасти определить иерархию возвращаемых данных, а затем сформировать запрос таким образом, чтобы каждый фрагмент полученных данных принадлежал к конкретному уровню иерархии (и обозначался соответствующим ему дескриптором) согласно сформулированным требованиям. Тем не менее возможности опции EXPLICIT главным образом перекрываются предусмотренными в опции PATH, поэтому поддержка опции EXPLICIT осуществляется главным образом для обеспечения обратной совместимости. PATH. Поддержка ключевого слова PATH была впервые введена в версии SQL Server 2005 для обеспечения возможности достижения такого же разнообразия функциональных средств, которые предоставляет опция EXPLICIT, но в более удобной форме. Поэтому, чтобы добиться высокой степени контроля над форматом выходных данных, следует использовать опцию PATH. Необходимо учитывать, что ни одна из указанных опций не обеспечивает формирования обязательного корневого элемента. Если требуется обеспечить, чтобы формируемые документы XML рассматривались как формально правильные, то необходимо ввести полученные результаты должным образом между открывающим и закрывающим дескрипторами корневого элемента. Хотя на первый взгляд такая особенность применения опции FOR XML рассматривается как причина затруднений, в этом есть свои преимущества. Дело в том, что указанный подход позволяет формировать более сложные документы XML, объединяя результаты нескольких запросов XML в одну строку и в дальнейшем оформляя полученные результаты в виде одного документа XML. Кроме описанных выше четырех основных опций форматирования, предусмотрено также пять других необязательных параметров, позволяющих дополнительно уточнять формат выходных данных, предоставляемых в СУБД SQL Server при выполнении запроса с ключевым словом FOR XML. XMLDATA. Эта опция служит для СУБД SQL Server указанием на то, что формируемым результатам должно предшествовать определение схемы XML. Схема определяет структуру документа (в том числе состав используемых типов данных), а также правила, которым должны соответствовать данные XML. ELEMENTS. Эта опция применима, только если используется также опция форматирования AUTO. Опция ELEMENTS служит для СУБД SQL Server указанием на то, что данные полей в возвращаемых результатах должны быть оформлены в виде вложенных элементов, а не атрибутов. BINARY BASE64. Эта опция является для СУБД SQL Sender указанием на то, что содержимое всех полей с двоичными данными (binary, varbinary, image) должно быть закодировано в формате base64. Если используется опция AUTO, то опция BINARY BASE64 вводится в действие по умолчанию (т.е. применяется в СУБД SQL Server, даже если она явно не задана). А при использовании опции EXPLICIT или RAW ключевое слово BINARY BASE64 не вводится в действие по умолчанию, но в настоящее время является единственно возможным вариантом получения приемлемых данных. На данный момент корпорация Microsoft осуществляет план, реализация которого в конечном итоге приведет к тому, что при использовании опции EXPLICIT или RAW будет формироваться ссылка URL на соответствующие двоичные данные (если не будет указано, что для них применяется кодировка BASE64), но этот план еще не реализован. TYPE. Эта опция рассматривается в СУБД SQL Server в качестве указания на то, что возвращаемые результаты должны быть обозначены как относящиеся к типу данных xml, а не к применяемому по умолчанию символьному типу данных Unicode. ROOT. С помощью данной опции можно указать, что корневой элемент должен быть сформирован в СУБД SQL Sender, поэтом} разработчику не нужно об этом заботиться. В таком случае можно либо явно задать имя корневого элемента, либо предусмотреть использование имени корневого элемента, заданного по умолчанию (root). Рассмотрим описанные выше опции более подробно. Опция RAW Опция RAW относится к числу наиболее простых. В основе ее применения лежит такая идея, что в СУБД уже есть все, что необходимо для обработки содержащихся в ней данных, поэтому можно обойтись без какого-либо специального форматирования и достаточно ввести лишь абсолютный минимум описательной информации, чтобы преобразовать строку реляционных данных в элемент, содержащий данные XML. Сам элемент получает имя row (об этом следует помнить, оформляя данные из разных таблиц), а имя каждого столбца в списке выборки используется в качестве имени атриб)та. При этом применяется такое имя, которое приобрел бы столбец после оформления содержащихся в нем данных в виде результирующего набора, если бы в рассматриваемом операторе SELECT не использовалась конструкция FOR XML. Одним из недостатков такого способа именования атрибутов является то, что необходимо обеспечить присваивание имени каждому столбцу. При обычных условиях, если выполняется агрегирование, или формируется другой вычисленный стюлбец и не предоставляется псевдоним, то СУБД SQL Server просто не показывает в выходных данных заготвок для этого столбца, а при выполнении запросов с конструкцией FOR XML каждый стюлбец обязательно должен иметь имя, поэтому не забывайте обозначать вы-чиспеиные и прочие безымянные столбцы псевдонимами. Итак, начнем рассмотрение данной темы с относительно простого примера. Предположим, что руководитель поручил нам подготовить запрос для получения списка заказов нескольких заказчиков, скажем, с идентификаторами CustomerlD, равными 1 и 2. Безусловно, материал, изложенный хотя бы в пяти первых главах настоящей книги, позволяет без особого труда выполнить указанную задачу, поэтому составим такой запрос: SELECT e.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 После выполнения этого запроса будут получены следующие результаты: 1 Aehong Gustavo 44132 2001-09-01 00:00:00.000 1 Aehong Gustavo 45579 2002-03-01 00:00:00.000 2 Abel Catherine 65157 2004-03-01 00:00:00.000 2 Abel Catherine 71782 2004-06-01 00:00:00.000 Итак, задача оказалась относительно несложной. Но после дополнительного уточнения постановки задачи стало ясно, что теперь требуется представить эти результаты в виде кода XML. Если такое преобразование придется выполнять вручную, то для этого потребуется не меньше одного-двух дней. Однако сведения, изложенные выше в данной главе, позволяют легко справиться с поставленной задачей, поэтому добавим к запросу два ключевых слова, FOR XML и RAW: SELECT e.ContactID, e.LastName, e.FirstName, soh.SalesOrderlD, soh.OrderDate FROM Person.Contact e JOIN Sales.SalesOrderHeader soh ON e.ContactID = soh.ContactID WHERE e.ContactID = 1 OR e.ContactID = 2 FOR XML RAW Ha данный момент полученные результаты вполне отвечают вьщвинутым требованиям. Эти выходные данные характеризуются взаимно однозначным соответствием с теми данными, которые находятся в результирующем наборе, полученном с помощью стандартного запроса SQL: <row ContaetID= l LastName= Aehong FirstName= Gustavo SalesOrderID= 44132 OrderDate= 2001-09-01T00:00:00 /> <row ContaetID= l LastName= Aehong FirstName= Gustavo SalesOrderID= 45579 OrderDate= 2002-03-01T00:00:00 /> <row ContaetID= l LastName= Aehong FirstName= Gustavo SalesOrderID= 46389 OrderDate= 2002-06-01T00:00:00 /> <row ContaetID= l LastName= Aehong FirstName= Gustavo SalesOrderID= 47454 OrderDate= 2002-09-01T00:00:00 /> <row ContaetID= l LastName= Aehong FirstName= Gustavo SalesOrderID= 48395 OrderDate= 2002-12-01T00:00:00 /> <row ContaetID= l LastName= Aehong FirstName= Gustavo SalesOrderID= 49495 OrderDate= 2003-03-01T00:00:00 />
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |