Как видите, теперь документу предшествует ХDR-схема, позволяющая проверить правильность его содержимого.
FOR XML EXPLICIT
В данном режиме можно формировать практически любые
документы; структура результирующего XML-документа определяется непосредственно
в самом запросе. Запрос может принимать очень сложный вид, ниже будут
рассмотрены правила, по которым он составляется.
Первое поле всегда называется tag и представляет собой
числовой идентификатор таблицы. Вы можете указывать для него любые числовые
значения. В результирующем документе он не появляется, и нужен только, чтобы
определить связи между таблицами для формирования иерархического документа.
Второе поле называется parent и тоже может представлять любой числовой
идентификатор. Он определяет родительскую таблицу для данной таблицы и в
результирующем документе также не присутствует. Если родитель отсутствует, указывается 0 или NULL. Для иерархических выборок нужно использовать несколько
запросов, объединенных с помощью оператора UNION ALL.
После двух обязательных полей tag и parent следуют
поля, которые требуется выбрать из таблицы. Для них должен быть задан псевдоним, определяющий тип XML-узла, его название и другую информацию. Вот синтаксис
этого псевдонима:
ElementName!TagNumber!AttributeName!Directive
|
Рассмотрим назначение каждой из частей этого
псевдонима:
ElementName – имя элемента, в котором будет находится
элемент данного поля. Обычно здесь указывается имя таблицы.
TagNumber – идентификатор таблицы, в которой находится
данное поле. Одному и тому же ElementName всегда должен соответствовать один
TagNumber. Он также не отображается ни в каком виде в результирующем документе, однако нужен для определения иерархических связей между таблицами.
AttributeName – имя атрибута (или элемента), представляющего данное поле.
Directive – по существу, представляет собой тип узла.
Может принимать следующие значения:
element
|
поле представляется в виде
элемента
|
xml
|
То же самое, что element, но не выполняет трансформации текста. Например, символ меньше (<) не
превращается в ссылку <
|
cdata
|
значение поля обрамляется
соответствующим образом. Имя атрибута указывать совместно с этим ключевым
словом нельзя.
|
hide
|
позволяет скрыть поле
|
id,idref,idrefs
|
позволяют делать ссылки на
другие элементы. Эти атрибуты имеют значение, только если создается схема
данных.
|
Рассмотрим небольшой пример. В самом начале мы
рассматривали запрос с использованием FOR XML RAW:
select
au_fname,au_lname,address from authors where au_fname like 'M%' for xml raw
|
Перепишем его с использованием FOR XML EXPLICIT: