SQL Server:使用FOR XML路径嵌套元素

SQL Server:使用FOR XML路径嵌套元素,sql,sql-server,xml,Sql,Sql Server,Xml,正在努力编写可以在XML中生成嵌套元素的查询。有人能帮忙吗 输入: SELECT EmpName AS [Name], EmpDOB AS [Birthdate], EmpSalary AS [WageAmount], Add1 AS [Address1], Add2 AS [Address2], Mobile AS [Mobile] FROM Employee FOR XML PATH 输出:(

正在努力编写可以在XML中生成嵌套元素的查询。有人能帮忙吗

输入:

SELECT EmpName AS [Name],
       EmpDOB       AS [Birthdate],
       EmpSalary        AS [WageAmount],
    Add1    AS [Address1],
    Add2    AS [Address2],
    Mobile  AS [Mobile]
FROM   Employee
FOR XML PATH 
输出:(它作为嵌套元素具有附加信息)


康拉德
1976年10月14日
10000
华盛顿特区
直流
989898989

在这种情况下,简单的方法是使用正斜杠分隔符在列别名中指定路径:

SELECT EmpName AS [Name],
       EmpDOB AS [Birthdate],
       EmpSalary AS [WageAmount],
       Add1 AS [AdditionalInfo/Address1],
       Add2 AS [AdditionalInfo/Address2],
       Mobile AS [AdditionalInfo/Mobile]
FROM   Employee
FOR XML PATH ('Employee')
您还可以使用在select列中返回XML的子查询来完成此操作。大概是这样的:

SELECT EmpName AS [Name],
       EmpDOB AS [Birthdate],
       EmpSalary AS [WageAmount],
       (select
           Add1 AS [AdditionalInfo/Address1],
           Add2 AS [AdditionalInfo/Address2],
           Mobile AS [AdditionalInfo/Mobile]
        from Employee EmpAddInfo
        where EmpAddInfo.EmployeeID=Employee.EmployeeID
        FOR XML PATH('AdditionalInfo'), TYPE 
        )
FROM Employee
FOR XML PATH ('Employee')

在您的情况下,这样做是愚蠢的,因为字段都在同一个表中,但是如果您有一个细节表要连接,您会这样做。

对于此任务,简单的
路径
模式是不够的,我们需要更详细的
显式
模式。这相当棘手,但在xml格式方面给了您最大的灵活性。详细说明可在现场查阅。下面是对当前问题的查询

declare @emp table(--test table
        EmpId int not null identity(1,1),
        EmpName varchar(50),
        EmpDOB datetime,
        EmpSalary money,
        Add1 varchar(50),
        Add2 varchar(50),
        Mobile varchar(20)
        )
--Add some data
insert @emp values
('Conrad','1976-10-14',10000,'Washington DC','DC','989898989'),
('Alex','1966-10-14',15000,'New York','NY','989898988')
-- prepare query 
SELECT 1    Tag, --mandatory field and level 
       0 Parent, --2nd field must be Parent 
       null [Employees!1!EmpID],  --get from 1st level
       NULL [Employee!2!Name!element],  --from 2nd level
       NULL [Employee!2!Birthdate!element],
       null [Employee!2!WageAmount!element],   
       null [AdditionalInfo!3!Address1!element],--from 3rd level
       null [AdditionalInfo!3!Address2!element],
       null [AdditionalInfo!3!Mobile!element]
FROM   @emp
union
SELECT 2    Tag,  --2nd level
       1    Parent, --refer to 1st level 
       EmpId [Employees!1!EmpID],  --all we need on this level
       EmpName [Employee!2!Name!element],  
       EmpDOB [Employee!2!Birthdate!element],
       EmpSalary [Employee!2!WageAmount!element],   
       null [AdditionalInfo!3!Address1!element]  ,
       null [AdditionalInfo!3!Address2!element]  ,
       null [AdditionalInfo!3!MObile!element]
FROM   @emp
union
SELECT 3    Tag,  --3rd level
       2 Parent,  --include into 2nd level
       EmpId [Employees!1],  
       NULL [Employee!2!Name!element],  
       NULL [Employee!2!Birthdate!element],
       null [Employee!2!WageAmount!element],   
       Add1 [AdditionalInfo!3!Address1!element]  ,
       Add2 [AdditionalInfo!3!Address2!element]  ,
       Mobile [AdditionalInfo!3!MObile!element]
FROM   @emp
order by [Employees!1!EmpID]
for xml explicit --This is explicit mode
测试结果:

<Employees>
  <Employee>
    <Name>Conrad</Name>
    <Birthdate>1976-10-14T00:00:00</Birthdate>
    <WageAmount>10000.0000</WageAmount>
    <AdditionalInfo>
      <Address1>Washington DC</Address1>
      <Address2>DC</Address2>
      <Mobile>989898989</Mobile>
    </AdditionalInfo>
  </Employee>
  <Employee>
    <Name>Alex</Name>
    <Birthdate>1966-10-14T00:00:00</Birthdate>
    <WageAmount>15000.0000</WageAmount>
    <AdditionalInfo>
      <Address1>New York</Address1>
      <Address2>NY</Address2>
      <Mobile>989898988</Mobile>
    </AdditionalInfo>
  </Employee>
</Employees>

康拉德
1976-10-14T00:00:00
10000
华盛顿特区
直流
989898989
亚历克斯
1966-10-14T00:00:00
15000
纽约
纽约
989898988

这就是我们需要的。

您可以通过在FOR XML PATH语句中包含根节点的名称来添加它。我把它加到了答案上-字符串连接。请参阅:查看您问题的新答案。如果我能获得康拉德的2条记录,请插入@emp值('Conrad'、'1976-10-14','10000','Washington DC'、'DC'、'989')、('Alex'、'1966-10-14',15000,'new York'、'NY'、'988')。。。第二秒钟,他改变了地址。。。。现在在additionalinfo下。。。我想显示两个地址如何使这成为可能。谢谢你的建议。。。关于如何更好地控制XML,非常简单。将第2级和第3级的EmpId更改为EmpName。
<Employees>
  <Employee>
    <Name>Conrad</Name>
    <Birthdate>1976-10-14T00:00:00</Birthdate>
    <WageAmount>10000.0000</WageAmount>
    <AdditionalInfo>
      <Address1>Washington DC</Address1>
      <Address2>DC</Address2>
      <Mobile>989898989</Mobile>
    </AdditionalInfo>
  </Employee>
  <Employee>
    <Name>Alex</Name>
    <Birthdate>1966-10-14T00:00:00</Birthdate>
    <WageAmount>15000.0000</WageAmount>
    <AdditionalInfo>
      <Address1>New York</Address1>
      <Address2>NY</Address2>
      <Mobile>989898988</Mobile>
    </AdditionalInfo>
  </Employee>
</Employees>