SQL Server:使用FOR XML路径嵌套元素
正在努力编写可以在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 输出:(
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>