2013-04-22 83 views
2

我使用了一个相当简单的Xpath查询(见下文)查询其值都遵循例子(低于)的形式的SQL Server 2008数据库列返回NULL。对于所有行,我的查询返回NULL,而不是example属性(例如“VALUE”)的值,即使我为查询的每一行都定义了example属性。的XPath有效的XPath表达式

我试过在我的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 
+2

我没有看到你提到的查询的命名空间。不'xsi'或'xsd',但默认设置一个,通过'http:// intranet' – 2013-04-22 18:55:08

+0

@StenPetrov我尝试添加的,但它并没有区别,所以我删除他们 – Dov 2013-04-22 18:57:55

+1

'xsd'和'xsi'赢得”不同,默认的命名空间会。我也有麻烦也破坏你的xpath。看起来你正在寻找'IsValid'作为具有'@ example'的'RootNode',这将是'// RootNode [@example]/IsValid' – 2013-04-22 19:02:15

回答

4

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

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

WITH XMLNAMESPACES (N'http://intranet' as intra) 
SELECT ColumnName.value('/intra:RootNode[@example]/intra:IsValid[1]', 'nvarchar(15)') [Result] 
FROM TableName 
+0

谢谢,这是我刚刚到达的另一种语法。 – Dov 2013-04-22 19:08:59

4

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

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

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