Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом примере извлекается идентификатор сотрудника и имя сотрудника для каждого сотрудника. В базе данных AdventureWorks2012 идентификатор employeeID можно получить из столбца BusinessEntityID в таблице Employee. Имена сотрудников можно получить из таблицы Person. Столбец BusinessEntityID можно использовать для объединения таблиц.
Предположим, что требуется преобразование FOR XML EXPLICIT для создания XML, как показано в следующем примере:
<Employee EmpID="1" >
<Name FName="Ken" LName="S??nchez" />
</Employee>
...
Так как в иерархии есть два уровня, вы напишете два SELECT
запроса и примените UNION ALL. Это первый запрос, который получает значения для <Employee
> элемента и его атрибутов. Запрос назначает 1
как Tag
значение для элемента <Employee
>, а NULL как Parent
, поскольку это элемент верхнего уровня.
SELECT 1 as Tag,
NULL as Parent,
E.BusinessEntityID AS [Employee!1!EmpID],
NULL as [Name!2!FName],
NULL as [Name!2!LName]
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID;
Это второй запрос. Он получает значения для <Name
> элемента. Он назначает 2
в качестве Tag
значения для элемента <Name
> и 1
в качестве значения тега Parent
, определяя <Employee
> как родительский элемент.
SELECT 2 as Tag,
1 as Parent,
E.BusinessEntityID,
FirstName,
LastName
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID;
Вы объединяете эти запросы с UNION AL
L, применяете FOR XML EXPLICIT
, и указываете требуемое ORDER BY
предложение. Сначала необходимо отсортировать набор строк по BusinessEntityID
, а затем по имени, так чтобы значения NULL в имени отображались первыми. Выполнив следующий запрос без предложения FOR XML, вы можете увидеть созданную универсальную таблицу.
Это окончательный запрос:
SELECT 1 as Tag,
NULL as Parent,
E.BusinessEntityID as [Employee!1!EmpID],
NULL as [Name!2!FName],
NULL as [Name!2!LName]
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID
UNION ALL
SELECT 2 as Tag,
1 as Parent,
E.BusinessEntityID,
FirstName,
LastName
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID
ORDER BY [Employee!1!EmpID],[Name!2!FName]
FOR XML EXPLICIT;
Частичный результат:
<Employee EmpID="1">
<Name FName="Ken" LName="S??nchez" />
</Employee>
<Employee EmpID="2">
<Name FName="Terri" LName="Duffy" />
</Employee>
...
Первый SELECT
задает имена столбцов в результирующем наборе строк. Эти имена образуют две группы столбцов. Группа, которая имеет Tag
значение 1
в имени столбца, определяет Employee
как элемент и EmpID
как атрибут. Другая группа столбцов имеет Tag
значение 2
в столбце и определяет <Name
> как элемент и FName
LName
как атрибуты.
В следующей таблице показан частичный набор строк, созданный запросом:
Tag Parent Employee!1!EmpID Name!2!FName Name!2!LName
--- ------ ---------------- ------------ ------------
1 NULL 1 NULL NULL
2 1 1 Ken S??nchez
1 NULL 2 NULL NULL
2 1 2 Terri Duffy
1 NULL 3 NULL NULL
2 1 3 Roberto Tamburello
...
Вот как строки в универсальной таблице обрабатываются для создания результирующего XML-дерева:
Первая строка определяет Tag
значение 1
. Таким образом, определяется группа столбцов с Tag
значением 1
Employee!1!EmpID
. Этот столбец указывает Employee
как имя элемента. Затем <Employee
> создается элемент с EmpID
атрибутами. Соответствующие значения столбцов назначаются этим атрибутам.
Вторая строка имеет Tag
значение 2
. Таким образом, идентифицируется группа столбцов, которая имеет в имени столбца значение Tag
, 2
, Name!2!FName
, Name!2!LName
. Имена этих столбцов идентифицируют Name
как имя элемента. Создается <Name
> элемент, имеющий FName
и LName
атрибуты. Затем соответствующие значения столбца назначаются этим атрибутам. Эта строка идентифицирует 1
как Parent
. Этот дочерний элемент добавляется в предыдущий <Employee
> элемент.
Этот процесс повторяется для остальных строк в наборе строк. Обратите внимание на важность упорядочивания строк в универсальной таблице, чтобы FOR XML EXPLICIT могли обрабатывать набор строк в порядке и создавать нужный XML-код.