【问题标题】:SQL to XML Nested Output IssueSQL 到 XML 嵌套输出问题
【发布时间】:2014-07-07 13:06:01
【问题描述】:

我在将 SQL 输出到 XML 时遇到了格式问题。

以下按预期工作:-

SELECT 
   AC.ACCOUNT AS 'Acct',
   (SELECT ITEMNO AS 'ITEM' 
   FROM ITEMS AS ITEMS1 WITH(NOEXPAND) 
   WHERE ITEMS1.CODE = AC.CODE
   FOR XML PATH ('Items'), TYPE)
FROM 
   AC WITH(NOLOCK) 
INNER JOIN 
   ITEMS ON AC.CODE = ITEMS.CODE
FOR XML PATH (''), ROOT ('Accts'), ELEMENTS

输出以下 XML:

<Accts>
   <Acct>94615130</Acct>
   <Items>
      <ITEM>1001</ITEM>
   </Items>
   <Items>
      <ITEM>1050</ITEM>
   </Items>
   <Items>
      <ITEM>1051</ITEM>
   </Items>
   <Items>
      <ITEM>1054</ITEM>
   </Items>
   <Items>
      <ITEM>1055</ITEM>
   </Items>
   ....
</Accts>

但是当我像这样在子查询的 where 中添加一个额外的子句时:

     SELECT 
     AC.ACCOUNT AS 'Acct',
     (SELECT ITEMNO AS 'ITEM' 
     FROM ITEMS AS ITEMS1 WITH(NOEXPAND) 
     WHERE ITEMS1.CODE = AC.CODE
     AND ITEMS1.ITEMNO = ITEMS.ITEMNO
     FOR XML PATH ('Items'), TYPE)
FROM 
     AC WITH(NOLOCK) 
INNER JOIN 
     ITEMS ON AC.CODE = ITEMS.CODE
FOR XML PATH (''), ROOT ('Accts'), ELEMENTS

我得到这个 xml 输出:

<Accts>
   <Acct>94615130</Acct>
   <Items>
      <ITEM>28</ITEM>
   </Items>
   <Acct>94615130</Acct>
   <Items>
       <ITEM>36</ITEM>
   </Items>
   <Acct>94615130</Acct>
   <Items>
      <ITEM>114</ITEM>
   </Items>
   <Acct>94615130</Acct>
   <Items>
      <ITEM>161</ITEM>
   </Items>
   ....
</Accts>

这不是我想要的。我需要像第一个示例中那样将所有项目分组在帐号下,而不是为每个项目重复帐号。

我使用的是 Microsoft SQL Server 2008,欢迎任何帮助。

【问题讨论】:

    标签: sql sql-server xml sql-server-2008


    【解决方案1】:

    我认为您需要摆脱外部查询中的内部联接。即:

    SELECT 
       AC.ACCOUNT AS 'Acct',
       (SELECT ITEMNO AS 'ITEM' 
       FROM ITEMS AS ITEMS1 
       WHERE ITEMS1.CODE = AC.CODE
       FOR XML PATH ('Items'), TYPE)
    FROM 
       AC 
    FOR XML PATH (''), ROOT ('Accts'), ELEMENTS
    

    【讨论】:

    • 感谢您的回复。加入的原因是我可以在子查询的 where 子句中匹配 Code 和 ItemNo,因为仅通过 Code 匹配不够唯一。
    • @user1319501 但这已经包含在内部 XML 中了,不是吗?
    • @user1319501 select .. as Itemxml
    • 我需要 where 子句是这样的:- WHERE ITEMS1.CODE = AC.CODE AND ITEMS1.ITEMNO = ITEMS.ITEMNO,这就是为什么我在外部查询中有内部联接。在 where 但是添加这个额外的子句会为 xml 中的每个项目编号重复帐号
    猜你喜欢
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多