【问题标题】:How to shred XML value in to a column in MSSQL?如何将 XML 值切碎到 MSSQL 中的列中?
【发布时间】:2018-11-17 05:20:43
【问题描述】:

这是我的代码:

DECLARE @xml XML
set @xml ='
<settings>
<value>1306</value>
<value>1307</value>
<value>1310</value>
</settings>'


select tabl.col.value ('value[1]','int')
from @xml.nodes ('/settings') tabl (col)
cross apply tabl.col.nodes ('value') as tabl1 (col1)

收到的输出:


1306

1306

1306

异常输出:


1306

1307

1310

请指出我的错误在哪里...

【问题讨论】:

    标签: sql sql-server xml sql-server-2008 xml-parsing


    【解决方案1】:

    不用cross apply,直接表示为

    select tabl.col.value ('.','int')
    from @xml.nodes ('settings/value') tabl (col);
    

    【讨论】:

    • 这个答案很好(我这边+1),但我会用text()[1] 替换.。您可能会read this 了解原因。在这种简单的情况下,它完全没问题。而且 - 通常 - 建议以单个 / 开头,以便将入口点标记为根元素 (/settings/value)。
    • 感谢您的解决方案
    【解决方案2】:

    请指出我的错误在哪里...

    select tabl.col.value ('value[1]','int')
    from @xml.nodes ('/settings') tabl (col)
    cross apply tabl.col.nodes ('value') as tabl1 (col1)
    

    您的错误:from @xml.nodes() 没有拉出重复元素&lt;value&gt;,而是调用&lt;settings&gt;。有一个单一的元素。现在选择第一个值('value[1]')。这将返回 1 行“1306”。

    但是您在&lt;settings&gt; 下方添加了一个cross apply 和一个对&lt;value&gt;相对 引用。这确实返回 3 行,但结果不会在任何地方使用。

    因此,您会得到每行重复的单个结果 1306。

    如何解决这个问题的解决方案在另一个答案中给出。

    【讨论】:

    • 感谢您的解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 2023-03-15
    • 2023-03-30
    • 2021-12-24
    • 2021-06-18
    • 1970-01-01
    相关资源
    最近更新 更多