2016-09-28 2 views
2

Я хочу, чтобы произвести файл XML в следующем формате:Multiple 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 должна иметь запись PRODATA в XML производства. Моего Стол этот

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') 

мне удалось получить желаемый результат, «заставляя» в ResultSet с вложенным запросом, как это:

(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

После того как вы clearified ваши потребности, я думаю, что это то, что вы хотите

--Новости стол

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 
) 

--test данные

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

Спасибо большое Шнуго! Это было именно то, что я хотел. – NotApplicable

Смежные вопросы