使用sql存储过程提取xml标记和值

时间:2013-06-03 02:46:55

标签: sql xml xquery

我有一些JSON格式的数据,我已经转换为xml,所以我可以将它传递给我的mssql sproc(因此看起来很滑稽的xml)。

现在我想要选择一个包含2列的结果集,一个带有标签名称(在本例中为3018或3017),另一列带有值,每个节点都有一行,但会有一个动态数字节点。

这种不寻常格式的原因是因为我的大多数程序都使用JSON,而这个小部分使用xml,我可以使用jsonconvert.deserializexmlnode方法进行相当干净的转换。

Psuedo代码如下:

任何有助于此工作的帮助都会非常感激,因为我正在努力解决这个问题。

DECLARE @xml XML =
'<root>
    <3018>1</3018>
    <3017>2</3017>
</root>'

select T.N.value(valueoftag, 'int')
select T.N.value(tagname, int)
from @XML.nodes('/root') as T(N)

1 个答案:

答案 0 :(得分:1)

您的xml片段不是有效的XML。标记名称不能以数字或标点符号开头。

现在,如果你有像这样的xml片段

DECLARE @xml XML =
'<root>
    <_3018>1</_3018>
    <_3017>2</_3017>
</root>'

然后,您可以使用查询获取名称和值

SELECT
    CAST(REPLACE(N.value('local-name(.)', 'VARCHAR(12)'), '_', '') AS INT) tagname,
    N.value('(.)[1]', 'INT') tagvalue 
 FROM @xml.nodes('/root/*') as T(N)

输出:

| TAGNAME | TAGVALUE |
----------------------
|    3018 |        1 |
|    3017 |        2 |

这是 SQLFiddle 演示