Формирование xml произвольной структуры — различия между версиями
(→Пример) |
(→Пример) |
||
Строка 45: | Строка 45: | ||
null as [person!3!record_id], | null as [person!3!record_id], | ||
null as [person!3!hash_last_name] | null as [person!3!hash_last_name] | ||
− | |||
union all | union all |
Версия 10:40, 27 июля 2015
Содержание
Введение
в данной статье будет рассмотрено формирование xml структур. Необходимость в данном механизме возникает как правило из-за требований сторонних систем, либо когда необходимо вернуть массив данных в сценарии Oktell (Oktell может получать только набор столбцов одной строки). Для этого будем использовать один из режимов для FOR XML, более подробно Вы можете ознакомиться по ссылкам:
Режим FOR XML EXPLICIT
Режим EXPLICIT предоставляет наибольшую гибкость при формировании желаемого XML из результатов запроса. Запрос в режиме EXPLICIT должен быть написан особым способом, при котором в запросе явно задаются дополнительные сведения о требуемом XML, такие как ожидаемый уровень вложенности в XML. В зависимости от запрашиваемого XML написание запросов режима EXPLICIT может оказаться весьма трудоемким. Может оказаться, что использование режима PATH с вложениями является более простой альтернативой написанию запросов в режиме EXPLICIT.
Режим EXPLICIT преобразует набор строк, получаемый в результате выполнения запроса, в XML-документ. Для того чтобы режим EXPLICIT создал XML-документ, набор строк должен иметь определенный формат. То есть необходимо написать запрос SELECT для создания набора строк, универсальной таблицы, имеющей определенный формат, так чтобы логика обработки могла создать желаемый XML. Во-первых, запрос должен создавать следующие два столбца метаданных: первый столбец должен предоставлять номер тега текущего элемента (целочисленного типа), и этот столбец должен иметь имя Tag. В запросе должен быть указан уникальный номер тега для каждого элемента, который будет создан из набора строк; второй столбец должен задавать номер тега для родительского элемента, и этот столбец должен иметь имя Parent. Таким образом, столбцы Tag и Parent предоставляют сведения об иерархии. Значения этих столбцов метаданных вместе со сведениями в именах столбцов используются для создания желаемого XML. Обратите внимание на то, что имена столбцов в запросе должны задаваться особым образом. Также обратите внимание на то, что значение 0 или NULL в столбце Parent указывает на то, что у соответствующего элемента нет родителя. Такой элемент добавляется в XML в качестве элемента верхнего уровня.
При написании запросов в режиме EXPLICIT имена столбцов в результирующем наборе строк должны быть заданы с использованием описанного далее формата. Они предоставляют сведения о преобразовании, включая имена элементов и атрибутов и другие дополнительные сведения, задаваемые при помощи директив.
Общий формат имеет вид:
ElementName!TagNumber!AttributeName!Directive
,где
- ElementName - Результирующий общий идентификатор элемента. Например, если Customers задано в качестве ElementName, формируется элемент <Customers>.
- TagNumber - Уникальное значение тега, присвоенное элементу. Это значение с помощью двух метастолбцов, Tag и Parent, определяет вложенность элементов в результирующем XML.
- AttributeName - Предоставляет имя создаваемого атрибута для указанного элемента ElementName. Это поведение используется, если не задано значение Directive. Если задано значение Directive, имеющее тип xml, cdata или element, оно используется для создания дочернего элемента ElementName, к которому добавляется значение столбца. При указании значения Directive значение AttributeName может быть пустым. Например: ElementName!TagNumber!!Directive. В этом случае значение столбца напрямую содержится в ElementName.
- Directive - Значение Directive является необязательным и может использоваться для предоставления дополнительных сведений для создания XML.
Пример
select 1 as tag, 0 as parent, null as [request!1!id], getdate() as [request!1!date], 'Тип запроса' as [request!1!request_type], null as [person_data!2!], null as [person!3!record_id], null as [person!3!hash_last_name] union all select 2 as tag, 1 as parent, null, null, null, null, null, null union all select 3 as tag, 2 as parent, null, null, null, null, row_number() over (order by name), name from oktell_settings.dbo.a_users for xml explicit