如何使用SQL选择具有根节点的XML列?

时间:2014-09-09 09:05:13

标签: sql-server xml

我试图从SQL数据库中检索一些XML列,并被一个" root"节点,但我发现很难找到正确的语法。

基本上,我在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>

我认为这将是&#34; root&#34;的变体。子句,为了让根节点成为&#34; ORDERS&#34;,但我似乎无法摆脱&#34;细节&#34;每个&#34;记录&#34;周围的父节点。即

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

感谢。

修改

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

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

1 个答案:

答案 0 :(得分:0)

您不需要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')