2017-01-26 12 views
0

Я излагаю свою проблему на примере. На самом деле решение i foudna после многих попыток, но я хотел бы спросить, хорошо ли это решение или по какой-либо причине лучше использовать альтернативный подход. На самом деле мне нужно контролировать, как создаются элементы.Управление вложением XML-элементов с использованием FOR XML

Сначала я сделал представление, содержащее все данные, которые мне нужны, а затем я выбрал их из вида, присоединившись к виду больше.

я воспроизвел «сложность» здесь, используя локальную переменную вместо зрения:

DECLARE @Employees table( 
    EmpID int NOT NULL, 
    Name nvarchar(50), 
    Surname nvarchar(50), 
    DateOfBirth date, 
    DepartmentID int, 
    AccessLevel int); 
insert into @Employees values ('1', 'John','Doe','1980-01-31',100,5) 
insert into @Employees values ('2', 'Mary','Rose','1971-02-27',102,3) 
insert into @Employees values ('3', 'Luke','Perry','1995-12-01',104,1) 

Это желаемый результат (сотрудник, отдел и безопасность differeent элементы - моя проблема в том, чтобы создать отдел персонала и безопасности так же, как в этом примере):

<employee Name="John" Surname="Doe" DateOfBirth="1980-01-31"> 
    <department DepartmentID="100"> 
    <security AccessLevel="5" /> 
    </department> 
</employee> 
<employee Name="Mary" Surname="Rose" DateOfBirth="1971-02-27"> 
    <department DepartmentID="102"> 
    <security AccessLevel="3" /> 
    </department> 
</employee> 
<employee Name="Luke" Surname="Perry" DateOfBirth="1995-12-01"> 
    <department DepartmentID="104"> 
    <security AccessLevel="1" /> 
    </department> 
</employee> 

Как я сказал, я обнаружил, что присоединение вид (здесь переменную таблицы) один раз в XML-элемент является решением:

-- declare @Employees table as above and then: 
    select 
     employee.Name, 
     employee.Surname, 
     employee.DateOfBirth, 
     department.DepartmentID, 
     security.AccessLevel from @Employees employee 
    join @Employees department on department.DepartmentID = employee.DepartmentID 
    join @Employees security on security.AccessLevel = employee.AccessLevel 
    for xml auto 

Это дает желаемый результат.

Эта технология нескольких соединений с for xml auto действительна или нет?

+0

Если он производит желаемого результата, то почему она не должна быть в силе? –

+0

Я знаю, но иногда есть устаревшие функции или лучшие практики, на самом деле принятый ответ демонстрирует гораздо лучшее решение, которое не использует joins +, дает контроль над атрибутом element vs. – LaBracca

ответ

3

Использовать @ в псевдонимах для генерации attributes в xml. Гораздо более простой способ сделать это

SELECT NAME   AS [@Name], 
     Surname  AS [@Surname], 
     DateOfBirth AS [@DateOfBirth], 
     DepartmentID AS [department/@DepartmentID], 
     AccessLevel AS [department/security/@AccessLevel] 
FROM @Employees 
FOR xml path('employee') 

Результат:

<employee Name="John" Surname="Doe" DateOfBirth="1980-01-31"> 
    <department DepartmentID="100"> 
    <security AccessLevel="5" /> 
    </department> 
</employee> 
<employee Name="Mary" Surname="Rose" DateOfBirth="1971-02-27"> 
    <department DepartmentID="102"> 
    <security AccessLevel="3" /> 
    </department> 
</employee> 
<employee Name="Luke" Surname="Perry" DateOfBirth="1995-12-01"> 
    <department DepartmentID="104"> 
    <security AccessLevel="1" /> 
    </department> 
</employee> 
+0

Большое спасибо. Это дает мне полный контроль, а также отвечает на соответствующий вопрос, который я задал по адресу http://stackoverflow.com/questions/41877549/sql-for-xml-how-to-avoid-a-specific-field-is-output-as-attribute – LaBracca