2

我正在使用一个相当简单的 Xpath 查询(下)来查询 SQL Server 2008 数据库列,其值都遵循示例的形式(下)。我的查询返回NULL所有行,而不是example属性的值(例如“VALUE”),即使该example属性是为我查询的每一行定义的。

我尝试在我的 Xquery 表达式中声明xsdxsi命名空间,并从多个不同的属性名称中进行选择,但都没有任何效果。我错过了什么?

查询

select ColumnName.value('(/RootNode/@example)[1]', 'nvarchar(15)') [Result]
  from TableName

XML 示例节点(实际的 XML 包含更多属性,我已省略):

<RootNode xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://intranet"
          example="VALUE">
  <IsValid>true</IsValid>
</RootNode>

尝试使用命名空间进行查询,结果相同

select ColumnName.value('
declare namespace xsd="http://www.w3.org/2001/XMLSchema";
declare namespace xsi="http://www.w3.org/2001/XMLSchema-instance";

(/RootNode/@example)[1]', 'nvarchar(15)') [Result]
  from TableName
4

2 回答 2

4

此查询有效。问题是数据节点声明了一个自定义的默认命名空间。

select ColumnName.value('
declare default element namespace "http://intranet";

(/RootNode/@example)[1]', 'nvarchar(15)') [Result]
  from TableName
于 2013-04-22T19:07:45.293 回答
4

您需要为您的 xml 数据添加默认命名空间,并且很可能会修改 xpath 查询。

我还没有运行这个来测试,但这是我最好的猜测,应该让你继续:

WITH XMLNAMESPACES (N'http://intranet' as intra)
SELECT ColumnName.value('/intra:RootNode[@example]/intra:IsValid[1]', 'nvarchar(15)') [Result]
FROM TableName
于 2013-04-22T19:07:04.623 回答