2016-09-28 73 views
2

我想,製成具有以下格式的XML文件:多個XML屬性

<ProData> 
    <DataSet Name="ABCD"> 
     <Data DataElement="AAA" Value="10"/> 
     <Data DataElement="BBB" Value="20"/> 
    </DataSet> 
    <DataSet Name="EFGH"> 
     <Data DataElement="CCC" Value="NAME"/> 
     <Data DataElement="DDD" Value="SURNAME"/> 
    </DataSet> 
</ProData> 

從MyTable的每一行都應該有生成的XML一個ProData記錄。 我的表是這樣的

CREATE TABLE MyTable(
    [CustomerNumber] [nvarchar](6) NOT NULL, 
    [AAA_Value] Int NOT NULL, 
    [BBB_Value] Int NOT NULL, 
    [Name]  [nvarchar](10) NOT NULL, 
    [Surname] [nvarchar](10) NOT NULL 
) 



INSERT [dbo].[MyTable] ([CustomerNumber], [AAA_Value], [BBB_Value], [Name], [Surname]) VALUES (N'123456', 10, 20, N'Phoebe', N'Buffay') 
INSERT [dbo].[MyTable] ([CustomerNumber], [AAA_Value], [BBB_Value], [Name], [Surname]) VALUES (N'234567', 30, 40, N'Ross', N'Geller') 

因此所需的輸出應該是:

<ProData> 
    <DataSet Name="ABCD"> 
     <Data DataElement="AAA" Value="10"/> 
     <Data DataElement="BBB" Value="20"/> 
    </DataSet> 
    <DataSet Name="EFGH"> 
     <Data DataElement="CCC" Value="Phoebe"/> 
     <Data DataElement="DDD" Value="Buffay"/> 
    </DataSet> 
</ProData> 
<ProData> 
    <DataSet Name="ABCD"> 
     <Data DataElement="AAA" Value="30"/> 
     <Data DataElement="BBB" Value="40"/> 
    </DataSet> 
    <DataSet Name="EFGH"> 
     <Data DataElement="CCC" Value="Ross"/> 
     <Data DataElement="DDD" Value="Geller"/> 
    </DataSet> 
</ProData> 

我使用的是FOR XML PATH查詢檢索我的XML文件,但我不能檢索多個嵌套元素成功,因以下錯誤:

The same attribute cannot be generated more than once on the same XML tag.

我的查詢如下:

(SELECT 
    blah, 
    'AAA'  as 'Common/Data/ProData/DataSet/Data/@DataElement', 
    AAA_Value AS 'Common/ApplicationData/ProData/DataSet/Data/@Value'  ,  
    'BBB'  as 'Common/Data/ProData/DataSet/Data/@DataElement' ,    
    BBB_Value as 'Common/Data/ProData/DataSet/Data/@Value', 
    blah 
FROM MyTable 
FOR XML PATH('Notification'),ROOT('NotificationsList'),    
TYPE) 
FOR XML PATH ('NotificationFile') 

我已成功通過「強制」中的結果與這樣的嵌套查詢,以獲得期望的結果:

(SELECT blah, 
    (SELECT 
     (SELECT 
      (SELECT 'AAA' AS 'Data/@DataElement' , 
        AAA_Value AS 'Data/@Value' 
        FROM MyTable WHERE CONDITION 
        FOR xml path(''), TYPE), 

      (SELECT 'BBB' AS 'Data/@DataElement' , 
        BBB_Value AS 'Data/@Value' 
        FROM MyTable WHERE CONDITION 
        FOR xml path(''), TYPE), 

      FOR xml path('DataSet'), TYPE) 
      FOR xml path('ProData'), TYPE) , 
    blah 
    FROM MyTable 
    FOR XML PATH('Notification'),ROOT('NotificationsList'),    
    TYPE  ) 
FOR XML PATH ('NotificationFile') 

我敢肯定,這是做一個可怕的方式,但我可以似乎沒有爲它管理更好的方式。 有人可以幫我嗎?

謝謝

+0

如何爲我們提供您使用的示例數據,以便我們可以嘗試協助? – Matt

+0

我提供了表格的佈局。謝謝! – NotApplicable

+0

嗨,不,你沒有提供你的表格佈局,只是一些列名...請提供一個真正的表格定義(帶類型)和一些樣品數據行以及適合這個數據的預期輸出... – Shnugo

回答

1

你澄清的你的需求,我認爲這是這一點,你想要什麼

- 您的表

CREATE TABLE MyTable(
    [CustomerNumber] [nvarchar](6) NOT NULL, 
    [AAA_Value] Int NOT NULL, 
    [BBB_Value] Int NOT NULL, 
    [Name]  [nvarchar](10) NOT NULL, 
    [Surname] [nvarchar](10) NOT NULL 
) 

- 測試數據

INSERT [dbo].[MyTable] ([CustomerNumber], [AAA_Value], [BBB_Value], [Name], [Surname]) 
VALUES (N'123456', 10, 20, N'Phoebe', N'Buffay') 
INSERT [dbo].[MyTable] ([CustomerNumber], [AAA_Value], [BBB_Value], [Name], [Surname]) 
VALUES (N'234567', 30, 40, N'Ross', N'Geller'); 

GO 

- 查詢

SELECT 
(
    SELECT 'ABCD' AS [@Name] 
      ,'AAA' AS [Data/@DataElement] 
      ,AAA_Value AS [Data/@Value] 
      ,'' 
      ,'BBB' AS [Data/@DataElement] 
      ,BBB_Value AS [Data/@Value] 
    FOR XML PATH('DataSet'),TYPE 
) 
,'' 
,(
    SELECT 'EFGH' AS [@Name] 
      ,'CCC' AS [Data/@DataElement] 
      ,Name AS [Data/@Value] 
      ,'' 
      ,'DDD' AS [Data/@DataElement] 
      ,Surname AS [Data/@Value] 
    FOR XML PATH('DataSet'),TYPE 
) 
FROM MyTable 
FOR XML PATH('ProData') 
GO 

- 清理關注真實數據!

--DROP TABLE MyTable; 

結果

<ProData> 
    <DataSet Name="ABCD"> 
    <Data DataElement="AAA" Value="10" /> 
    <Data DataElement="BBB" Value="20" /> 
    </DataSet> 
    <DataSet Name="EFGH"> 
    <Data DataElement="CCC" Value="Phoebe" /> 
    <Data DataElement="DDD" Value="Buffay" /> 
    </DataSet> 
</ProData> 
<ProData> 
    <DataSet Name="ABCD"> 
    <Data DataElement="AAA" Value="30" /> 
    <Data DataElement="BBB" Value="40" /> 
    </DataSet> 
    <DataSet Name="EFGH"> 
    <Data DataElement="CCC" Value="Ross" /> 
    <Data DataElement="DDD" Value="Geller" /> 
    </DataSet> 
</ProData> 

一個注意:空列之間(,'')告訴引擎啓動了新的元素。這將避免你的錯誤...

+0

我應該清除「ABCD」,「AAA」,「BBB」,「EFGH」,「CCC」,「DDD」都是硬編碼值,只有值來自表格。我會盡力調整你的答案,因爲它看起來比我的簡單得多,看看我能做些什麼。謝謝! – NotApplicable

+0

@NotApplicable,現在我明白了......看我的更新 – Shnugo

+0

非常感謝Shnugo!那正是我想要的。 – NotApplicable