带有未声明前缀的 SQL Server Xml 查询

Posted

技术标签:

【中文标题】带有未声明前缀的 SQL Server Xml 查询【英文标题】:SQL Server Xml query with undeclared prefix 【发布时间】:2017-04-27 10:16:26 【问题描述】:

我在 SQL Server 2008 中有一个变量,其中包含 XML 列的一部分,但我无法查询它。 XML 可以包含或不包含前缀“ns0”。我想从 xml 中检索 [from]。我试过的查询是这样的:

DECLARE @Params XML
SET @Params = '<filter>
                      <ns0:from>2016-09-19</ns0:from>
                      <ns0:to>2017-01-01<ns0:to>
               </filter>';
SELECT @Params.value('(/*:filter/*:from)[1]', 'Varchar(max)') AS [from]

我没有用于声明任何命名空间的 XML 标头。当我尝试执行此操作时,出现此错误:

 XML parsing: line 1, character 10, undeclared prefix

但是当我尝试这个时,一切正常:

SET @Params = '<filter>
                    <from>2016-09-19<from>
                    <to>2017-01-01<to>
               </filter>
SELECT @Params.value('(/*:filter/*:from)[1]', 'Varchar(max)') AS [from]

在给定上述带前缀或不带前缀的 xml 示例的情况下,如何使用 XPath 查询检索 [from]?

【问题讨论】:

第一个示例在将字符串解析为 XML 时失败 - 如果未声明命名空间,则该片段不是有效的 XML。您要么必须添加命名空间声明,要么删除元素命名空间。 (旁白,但您可能应该考虑将[from] 转换为日期(或datetime)数据类型,而不是varchar(max 【参考方案1】:

您的示例在两个方面无效:

    不允许有命名空间前缀而没有相应的命名空间声明。 您的关闭标签不包括/无处不在...

这是一个丑陋的 hack,但你可以试试这个:

DECLARE @Params XML
SET @Params = REPLACE('<filter>
                      <ns0:from>2016-09-19</ns0:from>
                      <ns0:to>2017-01-01</ns0:to>
               </filter>','ns0:','');
SELECT @Params.value('(/*:filter/*:from)[1]', 'date') AS [from];

如果您事先不知道所有命名空间前缀,这将变得非常棘手......

【讨论】:

以上是关于带有未声明前缀的 SQL Server Xml 查询的主要内容,如果未能解决你的问题,请参考以下文章

XML:一个命名空间前缀被声明为未声明,而事实上它是

SQL Server - 带有声明变量的In子句[重复]

如何将带有 xml 后代的 XElement 导入 SQL Server

使用SQL Server中的OPENXML解析带有内联架构的XML文件

SQL server学习T-SQL编程逻辑控制语句和安全模式

sql server 语句操作大全