【问题标题】:How to use SQL to select XML columns with a root node?如何使用 SQL 选择具有根节点的 XML 列?
【发布时间】:2014-09-09 09:05:13
【问题描述】:

我正在尝试从 SQL 数据库中检索一些被“根”节点包围的 XML 列,但我发现很难找到正确的语法。

基本上,我在一个 XML 列中有详细信息,我想返回一个 XML 结果,将所有列分组为父节点的子节点。

所以...鉴于此:

declare @changes table (order_no varchar(10), details xml)

insert into @changes values ('123', null)
insert into @changes values ('456', null)

update @changes set details = '<ORDER><ORDER_ID>' + order_no + '</ORDER_ID></ORDER>'

...我想生成这样的 XML...

<ORDERS>
  <ORDER>
    <ORDER_ID>123</ORDER_ID>
  </ORDER>
  <ORDER>
    <ORDER_ID>456</ORDER_ID>
  </ORDER>
</ORDERS>

我认为这将是“根”子句的变体,以使根节点成为“ORDERS”,但我似乎无法摆脱每个“记录”周围的“详细信息”父节点。即。

select details
from @changes
for xml path(''), root('ORDERS')

谢谢。

编辑:

我已经通过以下方式完成了我需要的工作,但这是最好的方式吗?

select details.query('/ORDER')
from @changes
for xml path(''), root('ORDERS')

【问题讨论】:

    标签: sql-server xml


    【解决方案1】:

    您不需要 XML 列。

    DECLARE @changes TABLE (order_no VARCHAR(10))
    
    INSERT INTO @changes VALUES ('123')
    INSERT INTO @changes VALUES ('456')
    
    SELECT order_no AS ORDER_ID
    FROM @changes
    FOR XML PATH('ORDER'), ROOT('ORDERS')
    

    SQL Fiddle

    结果:

    <ORDERS>
      <ORDER>
        <ORDER_ID>123</ORDER_ID>
      </ORDER>
      <ORDER>
        <ORDER_ID>456</ORDER_ID>
      </ORDER>
    </ORDERS>
    

    您考虑过不在列中添加ORDER 标签吗?

    DECLARE @changes TABLE (order_no VARCHAR(10), details XML)
    
    INSERT INTO @changes VALUES ('123', NULL)
    INSERT INTO @changes VALUES ('456', NULL)
    
    UPDATE @changes 
    SET details = '<ORDER_ID>' + order_no + '</ORDER_ID>'
    
    
    SELECT details AS ORDER
    FROM @changes
    FOR XML PATH(''), ROOT('ORDERS')
    

    【讨论】:

    • 你需要吗?它是一个表变量,所以你可以用它做任何你想做的事情。
    • 嗯...我实际上有从函数返回的 XML。我想为每个订单保存 XML,但是之前我从函数中返回了带有根节点的 XML,但我无法从保存的列中获取 XML(带有根)。
    • 在我看来,如果您可以更改函数以输出您需要的内容,最好从每一行中删除“ORDER”标签。这样你就可以保持简单,并且不必查询每个 xml 来获取内部节点。
    猜你喜欢
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多