使用OPENXML提取XML节点

时间:2017-10-13 20:11:02

标签: sql sql-server xml tsql xquery

sample_xml我尝试在SQL中使用OPENXML提取XML数据,但XML文件包含前缀,例如:" pidx:CustomerID> 01234",请参阅sample_xml。

如果我排除前缀" pidx:"它不能读取数据,如果我包括,则输出错误:

  

Msg 6603,Level 16,State 2,Line 15 XML解析错误:参考   未声明的命名空间前缀:' pidx'。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

除了永远不会将您的代码/ XML发布为图片之外,还有一些一般提示:

  • 您的前缀将元素绑定到命名空间。
  • 必须声明此命名空间!
  • 如果您的xml(如图所示)已完成,则无效!如果它只是更大的XML的一部分,您将在上面的某处找到命名空间的声明,在大多数情况下在根元素中
  • OPENXML已过时,不应再使用了。更好地使用XML的本地方法,如.value.nodes()

更新

根据评论中的要求,有关声明命名空间的必要性的一些解释。此XML无效:

<abc:test>1</abc:test>

试试这个:

DECLARE @xml XML=N'<abc:test>1</abc:test>';

你会得到这个

  

Msg 9459,Level 16,State 1,Line 1 XML解析:第1行,第10个字符,   未声明的前缀

现在声明命名空间并且它可以正常工作

DECLARE @xml XML=N'<abc:test xmlns:abc="blah">1</abc:test>';

这样的命名空间对于声明节点和层次结构(= 中)的所有元素都有效。

在大多数情况下,名称空间是在根节点中声明的

试试这个

DECLARE @xml XML=
N'
<root xmlns:abc="blah">
    <abc:test>1</abc:test>
</root>
';
SELECT @xml