2014-11-14 65 views
0

我幾乎完成了我需要的內容,但是最後一件事情是錯過了。我有2個表被連接來創建一個XML輸出。我需要在同一個SELECT語句中使用這兩個表的元素,但是在做這些工作時遇到了麻煩。此代碼是我所擁有的:在SQL Server 2014中使用XML EXPLICIT構建XML輸出

SELECT 
    1 as Tag, 
    0 as Parent, 
    RTRIM(dbo.DataItemInfo.DataItem) as [DataItem!1!name] 
    --RTRIM(dbo.DataItemInfo.DataItem) as [dbo.DataSchedule.DataItemValue!1!] 
FROM 
    dbo.DataItemInfo 
INNER JOIN 
    dbo.DataSchedule 
ON dbo.DataSchedule.SignID = dbo.DataItemInfo.SignID 
AND [email protected] 
AND dbo.DataSchedule.ScheduleID = dbo.DataItemInfo.ScheduleID 
FOR XML EXPLICIT, ROOT('DataItems') 

其中註釋掉的部分是我嘗試過的東西之一。目前,它產生的輸出:

<DataItems> 
    <DataItem name="Test1" /> 
    <DataItem name="Test2" /> 
    <DataItem name="Test3" /> 
    <DataItem name="Test4" /> 
    <DataItem name="Test5" /> 
</DataItems> 

但我想:

<DataItems> 
    <DataItem name="Test1">ValFromScheduleTableHere<DataItem/> 
    <DataItem name="Test2">ValFromScheduleTableHere<DataItem/> 
    <DataItem name="Test3">ValFromScheduleTableHere<DataItem/> 
    <DataItem name="Test4">ValFromScheduleTableHere<DataItem/> 
    <DataItem name="Test5">ValFromScheduleTableHere<DataItem/> 
</DataItems> 

我知道如何從原始表填充「ValFromScheduleTableHere」,但不能從第二個表。謝謝您的幫助。

+1

爲什麼不使用'FOR XML PATH'?與'FOR XML EXPLICIT'相比,它通常更容易理解並得到你想要的結果...... – 2014-11-14 16:21:12

+0

也許它會更容易,但是一旦我完成了這個小事情,我就完成了。 – Cory 2014-11-14 16:24:30

+0

我一直在使用sql server近9年,而且我只看到過一次使用'EXPLICIT'的XML查詢並且無法理解它,據我所知我必須使用FOR XML PATH( ''),在內部選擇TYPE來獲得相同的結果。 – 2014-11-14 16:37:04

回答

1

FOR XML PATH語法更簡單,您可以通過此SQL獲得期望的結果。

SELECT 
(
SELECT 
    RTRIM(dbo.DataItemInfo.DataItem) as 'DataItem/@name' 
    DataSchedule.DataitemValue as 'DataItem' 
FROM 
    dbo.DataItemInfo 
INNER JOIN 
    dbo.DataSchedule 
ON dbo.DataSchedule.SignID = dbo.DataItemInfo.SignID 
AND [email protected] 
AND dbo.DataSchedule.ScheduleID = dbo.DataItemInfo.ScheduleID 
FOR XML PATH(''), TYPE 
) 
FOR XML PATH(''), ROOT('DataItems') 
+0

+1 .....這就是我如何完成:) – 2014-11-14 16:38:13

+0

多數民衆贊成是如何做到了,謝謝!我不認爲我會再次使用XML EXPLICIT。這真是令人頭疼。 – Cory 2014-11-14 16:43:49

0

我知道這已經回答了,甚至是不再使用EXPLICIT模式,但我碰巧弄明白,所以我想我也有同感。無論好壞,你都非常接近。字段的實體值的列名稱缺少「指令」部分,這是時髦列名稱!常規的第4個(也是可選)部分。您需要!xml作爲最後一個部分,當然要調整了什麼是在RTRIM和別名的休息,這看起來會是這樣的:

RTRIM(DataSchedule.DataItemValue) as [DataItem!1!!xml] 

任何人都可以測試下面的理論(我對齊列別名更容易地看到在第三別名差):

SELECT 1 AS [Tag], 
     0 AS [Parent], 
     RTRIM(so.[type]) AS [Object!1!Type], 
     so.create_date AS [Object!1!CreateDate], 
     so.[name]  AS [Object!1!!xml] 
FROM sys.objects so 
FOR XML EXPLICIT, ROOT('Objects'); 

輸出:

<Objects> 
    <Object Type="S" CreateTate="2014-02-20T20:48:34.573">sysrscols</Object> 
    <Object Type="S" CreateTate="2009-04-13T12:59:05.513">sysrowsets</Object> 
    <Object Type="S" CreateTate="2014-02-20T20:48:34.807">sysclones</Object> 
    <Object Type="S" CreateTate="2009-04-13T12:59:05.500">sysallocunits</Object> 
    <Object Type="S" CreateTate="2003-04-08T09:13:37.267">sysfiles1</Object> 
    ... 
</Objects> 

欲瞭解更多信息,請參閱下面的MSDN PA ge:Use EXPLICIT Mode with FOR XML