2013-08-06 63 views
5

我有一些XML數據在SQL Server表中的XML列如下:SQL服務器的XQuery與默認命名空間

<AffordabilityResults> 
     <matchlevel xmlns="urn:callcredit.co.uk/soap:affordabilityapi2">IndividualMatch</matchlevel> 
     <searchdate xmlns="urn:callcredit.co.uk/soap:affordabilityapi2">2013-07-29T11:20:53</searchdate> 
     <searchid xmlns="urn:callcredit.co.uk/soap:affordabilityapi2">{E40603B5-B59C-4A6A-92AB-98DE83DB46E7}</searchid> 
     <calculatedgrossannual xmlns="urn:callcredit.co.uk/soap:affordabilityapi2">13503</calculatedgrossannual> 
    <debtstress xmlns="urn:callcredit.co.uk/soap:affordabilityapi2"> 
    <incomedebtratio> 
     <totpaynetincome>0.02</totpaynetincome> 
     <totamtunsecured>0.53</totamtunsecured> 
     <totamtincsec>0.53</totamtincsec> 
    </incomedebtratio> 
    </debtstress> 
</AffordabilityResults> 

你會注意到,一些元素有xmlns屬性和一些不...

我需要寫的查詢返回的數據 - 更重要的是顯示了業務分析師如何編寫自己的查詢來獲得她需要,所以我希望它儘可能簡單的數據。

我可以很容易地使用WITH XMLNAMESPACES元素如下查詢數據:

WITH XMLNAMESPACES (N'urn:callcredit.co.uk/soap:affordabilityapi2' as x) 
SELECT 

    ResponseXDoc.value('(/AffordabilityResults/x:matchlevel)[1]','varchar(max)') AS MatchLevel 
    , ResponseXDoc.value('(/AffordabilityResults/x:debtstress/x:incomedebtratio/x:totamtunsecured)[1]','nvarchar(max)') AS UnsecuredDebt 

    FROM [NewBusiness].[dbo].[t_TacResults] 

但加入X:部分查詢使它看起來過於複雜,我想保持簡單的業務分析師。

我嘗試添加:

WITH XMLNAMESPACES (DEFAULT 'urn:callcredit.co.uk/soap:affordabilityapi2') 

和取出X:從XQuery的 - 但這返回null

是否有任何(可能是因爲缺少根元素上的xmlns的?)我可以使用或不使用默認名稱空間來簡化這些查詢嗎?

+0

權,問題是,''是不是在一個命名空間,所以當你查詢的'甕元素:callcredit.co.uk ...'默認命名空間,你將無法選擇它。不幸的是有沒有辦法來分配前綴沒有命名空間,所以我認爲你必須在命名空間的元素使用前綴。 – wst

回答

15

如果命名空間在您的用例中不重要,您可以使用命名空間通配符選擇器*:,它們既選擇沒有任何名稱空間也沒有任意名稱空間的節點。

示例查詢可以

(/*:AffordabilityResults/*:matchlevel)[1] 

業務分析師仍然要在每一個節點測試前添加的選擇,但它是相同的「前綴」可以預料所有的時間和唯一的錯誤忘記在某個地方使用它。

+0

事實證明,這是我的問題,最簡單的辦法 - 感謝 – reach4thelasers

+1

感謝這個,幫我解決了,我也沒在意命名空間 – GenuineRex

+0

一個問題,這是真棒!我在一個數據庫(由另一家公司控制),我不能改變數據或模式工作,我們必須由第三方對處方填充一些XML領域。這與各種XML命名空間混亂。這使得無論他們覺得用這一天的命名空間的我的查詢來提取重要信息。 – MikeTeeVee