2013-05-06 15 views
1

我有以下腳本可以爲一個表生成XML。我需要稍微修改它,以便在一個XML查詢中從3個不同的表中提取它。我不知道如何修改它,以便它在1個查詢中完成。我應該創建一個存儲過程:用於來自不同表格的XML路徑。

SELECT 
CAST(EmployeeNumber AS varchar(9)) AS [employee/id], 
LastName AS [name/last], 
FirstName AS [name/first], 
'Employee' AS [persontype], 
email AS email 
FROM dbo.Employees AS sd 
WHERE (IsActive = 'Y') FOR XML PATH('employees')  

其他表:

dbo.Contractors

該查詢略有不同:

SELECT 
CAST(EmployeeNumber AS varchar(9)) AS [employee/id], 
LastName AS [name/last], 
FirstName AS [name/first], 
'Contractor' AS [persontype], 
email AS email 
FROM dbo.Employees AS sd 
WHERE (IsActive = 'Y') FOR XML PATH('employees')  

最後一個是:

dbo.Interns

SELECT 
CAST(EmployeeNumber AS varchar(9)) AS [employee/id], 
LastName AS [name/last], 
FirstName AS [name/first], 
'Intern' AS [persontype], 
email AS email 
FROM dbo.Employees AS sd 
WHERE (IsActive = 'Y') FOR XML PATH('employees')  

只有改變場就在這裏

回答

1

希望這將幫助:

select * from (
SELECT 
CAST(EmployeeNumber AS varchar(9)) AS [employee/id], 
LastName AS [name/last], 
FirstName AS [name/first], 
'Employee' AS [persontype], 
email AS email 
FROM dbo.Employees AS sd 
WHERE (IsActive = 'Y') 
union 
SELECT 
CAST(EmployeeNumber AS varchar(9)) AS [employee/id], 
LastName AS [name/last], 
FirstName AS [name/first], 
'Contractor' AS [persontype], 
email AS email 
FROM dbo.Employees AS sd 
WHERE (IsActive = 'Y' 
union 
SELECT 
CAST(EmployeeNumber AS varchar(9)) AS [employee/id], 
LastName AS [name/last], 
FirstName AS [name/first], 
'Intern' AS [persontype], 
email AS email 
FROM dbo.Employees AS sd 
WHERE (IsActive = 'Y')) employees 
FOR XML PATH('employees') 
+0

+1:我建議使用'有更好的表現UNION ALL'('[persontype]'是每個UNION分支不同,所以應該沒有重複反正)和一些縮進以提高可讀性。 – RBarryYoung 2013-05-06 15:04:53

+0

是的,你是對的性能,但這些查詢不能有重複,因爲第五行有明確的價值 – Pavel 2013-05-06 16:22:13

+0

我認爲這將工作,我打算從不同的表,但沒有指定查詢中的表......這是星期一畢竟:) – user1366606 2013-05-06 17:24:49

0

線5的任何理由,你爲什麼不能UNION這三個疑問?這將把3個單獨的查詢視爲一個數據集。