【问题标题】:SQL Server XML - embedding a dataset within an existing nodeSQL Server XML - 在现有节点中嵌入数据集
【发布时间】:2021-10-19 05:16:52
【问题描述】:

有很多将记录集插入 XML 的示例,但它们往往非常基础,并不能满足我的具体要求。在下面的例子中,我想将一些数据提取到 XML 中,在其中,我需要一个节点集合来表示可变数量的记录。我知道它可以做到,因为我有一个例子,但我不明白它是如何工作的。我确实理解我返回数据集的代码可能没有意义,但这只是为了代表我试图实现的一个示例。

SELECT 'Node' AS [A/B],
(
    SELECT x.Item
    FROM (
        SELECT 'Line1' AS [Item]
        FROM (SELECT 1 AS x) x

        UNION

        SELECT 'Line2' AS [Item]
        FROM (SELECT 1 AS x) x
    ) x
    FOR XML PATH(''), ROOT('Lines'), TYPE
)
FROM (SELECT 1 AS x) x
FOR XML PATH('Demo')

这给了我以下信息:

<Demo>
    <A>
        <B>Node</B>
    </A>
    <Lines>
        <Item>Line1</Item>
        <Item>Line2</Item>
    </Lines>
</Demo>

我想要的是以下内容:

<Demo>
    <A>
        <B>Node</B>
        <Lines>
            <Item>Line1</Item>
            <Item>Line2</Item>
        </Lines>
    </A>
</Demo>

谁能帮助或指出正确的答案?

【问题讨论】:

  • 如果您可以添加一些示例数据以配合您想要的输出,最好是作为create table 语句,您可能会在这里获得更多帮助,因为我们可以轻松复制并粘贴到我们的自己的环境来测试我们的想法
  • …ROOT('Lines'), TYPE ) as [A/*] FROM (SELECT 1 AS x) x… dbfiddle.uk/…
  • 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。

标签: sql sql-server xml


【解决方案1】:

对您应该能够轻松调整的源数据结构做出一些假设,以下脚本会为您提供您所追求的输出,即使跨多个Node 组:

查询

declare @t table([Node] varchar(10),Line varchar(10));
insert into @t values
 ('Node1','Line1')
,('Node1','Line2')
,('Node1','Line3')
,('Node1','Line4')
,('Node2','Line1')
,('Node2','Line2')
,('Node2','Line3')
,('Node2','Line4')
;

with n as
(
    select distinct [Node]
    from @t
)
select n.[Node] as [B]
      ,(select t.Line as Item
        from @t as t
        where t.[Node] = n.[Node]
        for xml path(''), root('Lines'), type
       )
from n
for xml path('A'), root('Demo')
;

输出

<Demo>
  <A>
    <B>Node1</B>
    <Lines>
      <Item>Line1</Item>
      <Item>Line2</Item>
      <Item>Line3</Item>
      <Item>Line4</Item>
    </Lines>
  </A>
  <A>
    <B>Node2</B>
    <Lines>
      <Item>Line1</Item>
      <Item>Line2</Item>
      <Item>Line3</Item>
      <Item>Line4</Item>
    </Lines>
  </A>
</Demo>

【讨论】:

  • 这为我指明了正确的方向。我正在使用 A 中的一个额外组处理 XML,为此我需要一个带有自己根的额外查询。我没有想到。
【解决方案2】:

您需要将A 作为外部查询的节点名称,并将Demo 作为其根。

SELECT 'Node' AS [B],
(
    SELECT x.Item
    FROM (
        SELECT 'Line1' AS [Item]

        UNION

        SELECT 'Line2' AS [Item]
    ) x
    FOR XML PATH(''), ROOT('Lines'), TYPE
)
FOR XML PATH('A'), ROOT('Demo'), TYPE

SQL Fiddle

【讨论】:

  • 您的输出标签排序与 OP 中的要求不匹配
  • 糟糕,现在已修复。
  • @Charlieface,很高兴看到一个工作示例。它并没有立即解决我的问题,但它为我指明了正确的方向。我正在处理的 xml 在 [Lines] 中有一个额外的组,我现在可以看到我需要一个带有自己根目录的额外查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多