【问题标题】:SQL Select XML nodes, parametrize node numberSQL 选择 XML 节点,参数化节点号
【发布时间】:2013-10-03 11:53:40
【问题描述】:

我正在从 XML 文档中选择数据,但是我需要遍历每个子节点对它们执行一些操作。

目前我在 select 周围有一个 while exists 循环,但不知道如何参数化节点号。

我了解以下内容不正确,但如果有人能指出参数化节点选择的最佳方法,我将不胜感激。

谢谢。

DECLARE @nodeCount varchar(1) = '1'
WHILE EXISTS (SELECT table.value('(Info/Data/DataInfo/Type/node())[' + @nodeCount + ']', 'nvarchar(10)') from table)

XML如下:

<Info xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Data>
<DataInfo>
  <Description>11111111111</Description>     
  <Type>1</Type>
</DataInfo>
<DataInfo>
  <Description>2222222222222</Description>     
  <Type>2</Type>
</DataInfo>
<DataInfo>
  <Description>3333333333333</Description>    
  <Type>3</Type>
</DataInfo>
</Data>
</Info>

【问题讨论】:

  • 您能给我们看一个该 XML 的示例吗?它是什么样子的,你想在这些 XML 节点上做什么?
  • XML 已在上面发布。我只需要一种方法来分别从每个节点获取数据。我可以通过传入数字来选择一个节点,但需要使其成为动态的。
  • 你可以使用table.nodes('/Info/Data/DataInfo') 之类的东西并遍历你返回的 XML 节点列表吗?

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


【解决方案1】:

你可以通过nodes()函数一次查询获取所有数据:

select
    t.c.value('(text())[1]', 'nvarchar(10)') as [Type]
from @xml.nodes('/Info/Data/DataInfo/Type') as t(c)

sql fiddle demo

或者,如果你真的想循环,你可以使用sql:variable()扩展函数:

DECLARE @nodeCount int = 1
WHILE EXISTS (SELECT table.value('(Info/Data/DataInfo/Type/node())[sql:variable("@nodeCount")][1]', 'nvarchar(10)') from table)

sql fiddle demo

【讨论】:

  • 完美!正是我想要的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多