【问题标题】:Multiple XML attributes多个 XML 属性
【发布时间】:2016-09-28 21:14:27
【问题描述】:

我想生成一个格式如下的 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 文件,但由于以下错误,我无法成功检索多个嵌套元素:

不能在同一个 XML 上多次生成同一个属性 标记。

我的查询如下:

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

我很确定这是一种糟糕的方法,但我似乎找不到更好的方法。

【问题讨论】:

  • 能否向我们提供您使用的示例数据,以便我们尝试提供帮助?
  • 我提供了表格的布局。谢谢!
  • 嗨,不,您没有提供表格的布局,只是提供了一些列名...请提供真实的表格定义(带类型)和一些示例数据行以及预期的输出拟合这个数据...
  • 你是对的!我再次更新了问题
  • 我已经投票了 :-)

标签: sql-server xml resultset


【解决方案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>

注意:中间的空列 (,'') 告诉引擎启动一个新元素。这将避免您遇到的错误...

【讨论】:

  • 我应该清除“ABCD”、“AAA”、“BBB”、“EFGH”、“CCC”、“DDD”都是硬编码值,只有值来自表.我会尝试调整你的答案,因为它看起来比我的简单得多,看看我能做什么。谢谢!
  • 非常感谢Shnugo!这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多