Мне нужно собрать список отдельных сотрудников из файла XML, который содержит журнал продаж, сделанных каждым сотрудником. К сожалению, данные в файле XML не совсем "согласованы". Файл структурирован так:
<Sale EmployeeId="67890" EmployeeName="John" EmployeeManagerId="12345"
CustomerName="Bob" SaleNumber="..." />
<Sale EmployeeId="67890" EmployeeName="John" EmployeeManagerId="12345"
CustomerName="Pat" SaleNumber="..." />
<Sale EmployeeId="67890" EmployeeName="" EmployeeManagerId="12345"
CustomerName="Sally" SaleNumber="..." />
<Sale EmployeeId="67890" EmployeeName="" EmployeeManagerId="12345"
CustomerName="Sue" SaleNumber="..." />
<Sale EmployeeId="67890" EmployeeName="John" EmployeeManagerId=""
CustomerName="Jack" SaleNumber="..." />
<Sale EmployeeId="58203" EmployeeName="Fred" EmployeeManagerId=""
CustomerName="Bill" SaleNumber="..." />
Этот XML-файл загружается в веб-приложение, которое передает свое содержимое (в виде XML) в хранимую процедуру в SQL Server для обработки. Из-за размера этого файла (до 30 000 элементов) я хотел бы выполнить как можно меньше обработки в веб-приложении.
Лучшее решение, которое я нашел до сих пор, - это создать временную таблицу с одной строкой для каждого отдельного значения EmployeeId и ManagerId. Затем для каждой строки в таблице циклически просматривайте элементы XML, которые имеют соответствующий EmployeeId, пока не найдете запись, имя которой не равно нулю (затем повторите для ManagerId).
Таким образом, для каждого уникального идентификатора сотрудника я бы дважды повторил результаты, чтобы узнать, смогу ли я найти его имя и идентификатор менеджера.
После обработки файла я ожидаю, что таблица Employee будет выглядеть следующим образом:
+---------+------+------------+
| Id (PK) | Name | ManagerId |
+---------+------+------------+
| 12345 | NULL | NULL |
| 67890 | John | 12345 |
| 58203 | Fred | NULL |
+---------+------+------------+
Есть ли более эффективное (и менее процедурное) решение для этого?