2017-01-26 49 views
0

我举例说明了我的问题。事实上,我在很多方面尝试后都会想到解决方案,但我想问一下这个解决方案是否合适,或者是否因为某种原因,最好使用其他方法。事实上,我需要控制如何创建元素。使用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元素 - 我的问题是要创造员工部门,安全就像在本实施例中):

<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

我知道,但有时候有不推荐的功能或更好的做法,事实上,接受的答案显示了一个更好的解决方案,它不使用连接+控制元素vs属性 – LaBracca

回答

3

在别名中使用@xml中生成attributes。更简单的方式来做到这一点

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