如何在T-SQL中迭代XML字段的节点?

时间:2011-02-15 16:14:56

标签: tsql

我有一个XML字段,我知道其中至少有一个“ChildNode”,但可能更多。我试图在T-SQL中创建一个循环,它将每个ChildNode的XML作为VarChar(1000)并用它做一些逻辑。当我尝试以下内容时......

...
SET @intIterator=1 

SET @strValue = (SELECT XMLField.value('(/RootNode/ParentNode/ChildNode)[' + CAST(@intIterator AS VARCHAR(2)) + ']', VARCHAR(1000)) WHERE PrimaryKeyField=@intID)

WHILE LEN(@strValue) > 0
   BEGIN

      --LOGIC with @strValue not shown.
      @intIterator = @intIterator + 1
      @strValue = (SELECT XMLField.value('(/RootNode/ParentNode/ChildNode)[' + CAST(@intIterator AS VARCHAR(2)) + ']', VARCHAR(1000)) WHERE PrimaryKeyField=@intID)

   END

我收到以下错误: xml数据类型方法“value”的参数1必须是字符串文字。

我知道当我尝试在值方法中使用@intIterator时,它正在爆炸,因为它需要字符串文字而不是变量,但是如何在T-SQL中逐个遍历子节点?

2 个答案:

答案 0 :(得分:15)

我不知道您的XML是什么样的,但您可能必须使用不同的方法 - 不要尝试迭代和循环这样的东西 - 而是使用XQuery中的.nodes()函数:

SELECT 
    Child.value('(SomeElement)[1]', 'int'),
    Child.value('(SomeOtherElement)[1]', 'Varchar(50)')
FROM
    XMLField.nodes("/RootNode/ParentNode/ChildNode") AS N(Child)

这基本上是迭代/循环到XQuery,你不必乱用索引或任何类似的东西......

答案 1 :(得分:6)

仍然需要查询这个问题的答案无法解决的子元素。您可以使用sql:variable来满足字符串文字参数的nodes()要求,以迭代方式查询特定节点的子元素。

DECLARE @iterator = 1

SELECT 
    Child.value('(SomeElement)[1]', 'int'),
    Child.value('(SomeOtherElement)[1]', 'Varchar(50)'),
FROM
    XMLField.nodes("/RootNode/ParentNode[sql:variable("@iterator")]/ChildNode") AS N(Child)