2012-05-05 29 views
3

我在xml输出中遇到了一个小问题。带有动态SQL的SQL Server XML输出

I need to get xml structure like this:

,这里是我的程序,它会列出所有的员工和一些基于输入自己的个人信息 的。

CREATE PROC getDeptEmployees(@deptList varchar(500)) 
AS 
BEGIN 
SET NOCOUNT ON 

DECLARE @Query varchar(600) 

SET @Query = ' 
SELECT department.DEPARTMENT_ID [f_Department_ID], department.DEPARTMENT_NAME [f_Department_name], 
dp.Employee_id [f_Employee_ID], dp.First_name [f_First_Name], 
dp.Last_Name [f_Last_name], dp.Email [f_email], dp.Salary [f_salary] 
FROM dbo.Employees dp 
JOIN DEPARTMENTS department 
ON dp.DEPARTMENT_ID = department.DEPARTMENT_ID 
WHERE dp.Department_id IN (' + @deptList + ') 
for XML AUTO, ROOT(''table'')' 

EXEC(@Query)  
END 
GO 

我得到的是here 但我仍然无法弄清楚如何添加DPR节点。

谢谢

回答

3

您需要使用SQL Server 2005中的FOR XML PATH功能,以及相关子查询 - 沿此线的东西:

SELECT 
    d.Department_ID AS '@f_Department_ID', 
    d.Department_Name AS '@f_Department_name', 
    (SELECT 
     e.BusinessEntityID AS '@f_Employee_ID', 
     e.FirstName AS '@f_First_Name', 
     e.LastName AS '@f_Last_name', 
      e.Email AS '@f_email', 
     e.Salary AS '@f_salary' 
    FROM 
     dbo.Employee e 
    WHERE 
     e.Department_ID = d.Department_ID 
    FOR XML PATH('dp'), TYPE 
    ) AS 'dpr' 
FROM 
    dbo.Department d 
WHERE 
    d.DepartmentID IN (.......) 
ORDER BY 
    d.DepartmentID 
FOR XML PATH('department'), ROOT('table') 

基本上,最内层查询创建XML元素用于单个雇员

<dp f_Employee_ID="6" f_First_Name="Jossef" f_Last_name="Goldberg" f_salary="998320692" /> 

AS 'dpr'别名使用这个作为一个相关子查询然后包裹升员工对于一个给定的部门IST成<dpr>标签:

<dpr> 
    <dp f_Employee_ID="4" f_First_Name="Rob" f_Last_name="Walters" f_salary="112457891" /> 
    <dp f_Employee_ID="11" f_First_Name="Ovidiu" f_Last_name="Cracium" f_salary="974026903" /> 
    <dp f_Employee_ID="12" f_First_Name="Thierry" f_Last_name="D'Hers" f_salary="480168528" /> 
    <dp f_Employee_ID="13" f_First_Name="Janice" f_Last_name="Galvin" f_salary="486228782" /> 
</dpr> 

你那么这个XML片段添加到最外部SELECT它创建<department>节点,你应该得到所需的输出。

欲了解更多信息有关FOR XML PATH看到:

+1

谢谢你,它完美的作品!现在事情更容易理解。 – justartem

+0

@Caerus:是的,对于SQL Server的XML支持,“FOR XML PATH”模式是一个非常有用的补充! –