【问题标题】: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() 没有拉出重复元素<value>,而是调用<settings>。有一个单一的元素。现在选择第一个值('value[1]')。这将返回 1 行“1306”。
但是您在<settings> 下方添加了一个cross apply 和一个对<value> 的相对 引用。这确实返回 3 行,但结果不会在任何地方使用。
因此,您会得到每行重复的单个结果 1306。
如何解决这个问题的解决方案在另一个答案中给出。