使用FOR XML控制XML元素嵌套

时间:2017-01-26 15:37:48

标签: sql-server xml sql-server-2008-r2 for-xml

我通过例子陈述我的问题。事实上,在尝试了很多方面之后,我的foudna解决方案,但我想问这个解决方案是否良好,或者无论出于何种原因,使用替代方法更好。 实际上我需要控制元素的创建方式。

我首先制作了一个包含我需要的所有数据的视图,然后我通过多次加入视图从视图中选择。

我使用局部变量而不是视图来复制“复杂性”:

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)

这是期望的结果(员工,部门和安全性是不同的要素 - 我的问题是创建员工部门和安全性,就像在这个例子中一样):

<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有多个联接的技术是否有效?

1 个答案:

答案 0 :(得分: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>