2017-01-26 8 views
0

예를 통해 문제를 설명합니다. 사실 나는 여러 가지 방법으로 시도한 후에 솔루션을 foudna하지만이 솔루션이 좋은지 또는 어떤 이유로 든 다른 방법을 사용하는 것이 더 나은지 묻습니다. 사실 요소를 만드는 방법을 제어해야합니다.FOR XML을 사용하여 중첩되는 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 요소 - 내 문제는 직원의 부서를 만드는 것이었다과 단)이 예에서와 같은 보안 :

: 나는 여기 뷰 (표 변수) XML 요소에 한 번 입사하는 용액임을 알았다 말했듯

<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> 

-- 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

나도 알아,하지만 때로는 거기에 더 이상 사용되지 않는 기능이나 더 나은 관행, 사실 수용 대답은 조인을 사용하여 더 나은 솔루션을 보여줍니다 + 요소 대 속성에 대한 제어를 제공합니다 – LaBracca

답변

3

별칭 이름에서 @을 사용하면 attributesxml에 생성합니다. 이

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