2017-01-26 34 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>