【问题标题】:Sql "FOR XML" Simple sections breakoutSql "FOR XML" 简单部分突破
【发布时间】:2012-10-30 11:11:35
【问题描述】:

我需要在这里向正确的方向轻推。简化后的数据如下:

ItemId|ItemName|ObjectId|ObjectName
    1 |  Alpha |      1 |  Alpha-1
    1 |  Alpha |      2 |  Alpha-2
    2 |   Beta |      3 |   Beta-1
    2 |   Beta |      4 |   Beta-2

而我的目标 xml 需要是:

<Root>
  <Items>
    <Item>
      <id>1</id>
      <name>Alpha</name>
    </Item>
    <Item>
      <id>2</id>
      <name>Beta</name>
    </Item>
  </Items>
  <Objects>
    <Object>
      <id>1</id>
      <item_id>1</item_id>
      <name>Alpha-1</name>
    </Object>
    <Object>
      <id>2</id>
      <item_id>1</item_id>
      <name>Alpha-2</name>
    </Object>
    <Object>
      <id>3</id>
      <item_id>2</item_id>
      <name>Beta-1</name>
    </Object>
    <Object>
      <id>4</id>
      <item_id>2</item_id>
      <name>Beta-2</name>
    </Object>
  </Objects>
</Root>

我在使用FOR XML 语句语法时遇到问题,它允许在Items 部分和Objects 部分之间出现这种中断。我知道如何单独编码每个部分(Objects 无论如何),但不知道如何获得这个堆叠输出。我可以从这里显示的单个视图中执行此操作,还是我需要将内容拆分并以某种方式将 xml 拼接在一起?

【问题讨论】:

    标签: sql xml sql-server-2005


    【解决方案1】:

    是的,您需要“拆分内容,然后以某种方式将 xml 重新拼接在一起?”。您需要两个查询,一个用于项目,一个用于对象。
    这是一种方法。

    declare @T table
    (
      ItemId int,
      ItemName varchar(10),
      ObjectId int,
      ObjectName varchar(10)
    )
    
    
    insert into @T
    select    1 ,  'Alpha',       1,   'Alpha-1' union all
    select    1 ,  'Alpha',       2,   'Alpha-2' union all
    select    2 ,   'Beta',       3,    'Beta-1' union all
    select    2 ,   'Beta',       4,    'Beta-2'
    
    
    select 
      (
      select ItemId as id,
             ItemName as name
      from @T
      group by ItemId, ItemName
      for xml path('Item'), root('Items'), type
      ),
      (
      select ObjectId as id,
             ItemId as item_id,
             ObjectName as name
      from @T
      for xml path('Object'), root('Objects'), type
      )
    for xml path('root')
    

    【讨论】:

    • @RoyiNamir 它偶尔会发生。实际上我昨天被叫到那里讨论一个问题。
    • 说到 XML,在什么情况下您会将列设置为 XML 类型? (忽略人们向您发送 XML 并且您需要存储它的情况......)....你能提供一个真实的生活场景吗? (用 1 句话)好吗?
    • @RoyiNamir 我从未在生产中的常规表中使用过 XML 数据类型,所以我还没有找到这样做的理由。我主要将它用作将数据结构作为参数发送到存储过程的工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2018-08-01
    相关资源
    最近更新 更多