【问题标题】:How do I iterate through the Nodes of a XML Field in T-SQL?如何在 T-SQL 中遍历 XML 字段的节点?
【发布时间】:2016-12-07 23:43:05
【问题描述】:

我有一个 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必须是字符串字面量。

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

【问题讨论】:

    标签: tsql


    【解决方案1】:

    我不知道您的 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,您根本不必搞乱索引或类似的东西.....

    【讨论】:

    • 完全正确。你在一个关系数据库中。考虑基于集合的逻辑,而不是循环和程序逻辑。
    • 对不起@marc_s,你能编辑你的帖子吗? `'Varchar(50)'),` 中有一个额外的逗号。我无法编辑,因为它只有 1 个符号。
    【解决方案2】:

    仍然可能需要查询该问题的答案无法解决的子元素。您可以只使用 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)
    

    【讨论】:

    • XQuery [value()]: 'value()' 需要一个单例(或空序列),找到类型为 'xdt:untypedAtomic *' 的操作数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多