2017-01-26 33 views
0

我想提高我的例子中Control on XML elements nesting using FOR XML如何在for xml select中添加包装元素?

做,我想补充一点,包装所有元素

数据(在这个例子中,信息是关于这家公司。):

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

预期结果:

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

如何查询@employees表来获得资源ULT?

我发现的唯一方法是将链接问题的查询保存到字符串变量中,并在其之前和之后手动追加数据。

是否可以通过查询来实现结果?

回答

0

您可以为companyId这样相关子查询:

select 
    companyid as "@companyID", 
    cast((
     select name as "@Name", 
      surname as "@Surname", 
      dateofbirth as "@DateOfBirth", 
      departmentid as "department/@departmentID", 
      accesslevel as "department/security/AccessLevel" 
     from @employees e2 
     where e2.companyid = e1.companyid 
     for xml path('employee') 
    ) as xml) 
from @employees e1 
group by companyid for xml path('company'); 

产地:

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