2016-09-28 4 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="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> 

로 인해, 내 XML 파일을 검색하는 FOR XML PATH 쿼리를 사용하고 있지만 여러 중첩 된 요소를 검색에 성공할 수 없다 : 내 표는이

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

그래서 원하는 출력해야한다입니다 다음과 같은 오류 :

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

내 쿼리는 다음과 같습니다

,536,913 63,210
(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') 

,하지만 난 할 수 그것을위한 더 좋은 방법을 관리하는 것 같지 않습니다. 누군가 나를 도울 수 있습니까? 당신이 당신의 요구를 clearified 한 후

내가 당신이 원하는 무엇을이를 생각, 당신에게

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

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

고맙습니다 Shnugo! 그것은 내가 원했던 바로 그 것이었다. – NotApplicable