2013-04-22 85 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