2013-08-06 16 views
5

Mam niektóre dane XML w tabeli SQL Server w kolumnie XML w następujący sposób:SQL Server XQuery z obszaru nazw Domyślnie

<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> 

Będziesz pamiętać, że niektóre elementy mają atrybut xmlns an a niektóre nie ...

Muszę pisać zapytania, aby zwrócić dane - i co ważniejsze pokazać analitykowi biznesowemu, jak pisać własne zapytania, aby uzyskać potrzebne dane, więc chcę, aby było tak proste, jak to tylko możliwe.

mogę kwerendy danych łatwo za pomocą elementu z XMLNAMESPACES następująco:

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] 

Ale dodanie X: część do zapytania sprawia, że ​​wygląda zbyt skomplikowane, a ja chcę zachować to proste dla biznesu analityk.

Próbowałem dodając:

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

i usuwania X: z XQuery - ale ta zwraca null

Czy istnieje (prawdopodobnie z powodu braku xmlns w elemencie głównym?) sposób mogę uprościć te zapytania z domyślnym obszarem nazw lub bez niego?

+0

W porządku, problem polega na tym, że '' nie znajduje się w przestrzeni nazw, więc kiedy domyślnie wyszukujesz elementy w przestrzeni nazw 'urn: callcredit.co.uk ... ', nie możesz jej wybrać. Niestety nie ma możliwości przypisania prefiksu do przestrzeni beznapisowej, więc myślę, że musisz użyć prefiksów na elementach o przestrzeni nazw. – wst

Odpowiedz

15

Jeśli przestrzenie nazw nie są ważne w twoim przypadku użycia, możesz użyć selektora wieloznacznego przestrzeni nazw *:, który obie wybiera węzły bez i z arbitralnymi przestrzeniami nazw.

Przykładem zapytania może być

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

Analityk biznesowy nadal będą musiały włożyć selektor przed każdym testem węzła, ale to samo „prefix” cały czas i tylko błąd należy się spodziewać zapomina się go gdzieś użyć.

+0

To było najprostsze rozwiązanie mojego problemu - dzięki – reach4thelasers

+1

dzięki temu pomogło mi rozwiązać problem, w którym nie dbałem o przestrzeń nazw – GenuineRex

+0

To jest niesamowite! Pracuję w bazie danych (kontrolowanej przez inną firmę), gdzie nie mogę zmienić danych lub schematu i mamy pewne pola XML, które są zapełniane przez strony trzecie dla recept. To bałagan z różnymi znakami XML. Dzięki temu moje zapytania mogą wyodrębnić ważne informacje, niezależnie od tego, jakiej przestrzeni nazw mieli ochotę używać tego dnia. – MikeTeeVee

Powiązane problemy