2013-08-06 3 views
5

ich in einer XML-Spalte einige XML-Daten in einer SQL Server-Tabelle haben wie folgt:SQL Server XQuery mit Standard-Namespace

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

Sie werden bemerken, dass einige der Elemente eine xmlns Attribut und einige nicht ...

Ich muss Abfragen schreiben, um die Daten zurückzugeben - und noch wichtiger, zeigen Sie einem Business Analyst, wie Sie ihre eigenen Abfragen schreiben, um die Daten zu bekommen, die sie braucht, damit ich es so einfach wie möglich will.

kann ich die Daten abfragen, leicht das WITH XMLNAMESPACES Element wie folgt verwendet:

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] 

Aber Hinzufügen der x: Teil auf die Abfrage es zu kompliziert aussehen läßt, und ich will es für das Geschäft einfach halten Analytiker.

Ich habe versucht, und fügte hinzu:

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

und Entfernen des x: von der XQuery - aber das gibt null zurück

Gibt es eine (möglicherweise wegen des Fehlens der xmlns auf dem Root-Element?) So kann ich diese Abfragen entweder mit oder ohne den Standard-Namespace vereinfachen?

+0

Richtig, das Problem ist, dass '' nicht in einem Namespace ist. Wenn Sie also Elemente im Namespace 'urn: callcredit.co.uk' abfragen, können Sie es nicht auswählen. Leider gibt es keine Möglichkeit, No-Namespace ein Präfix zuzuweisen, also denke ich, dass Sie Präfixe für die Namespaced-Elemente verwenden müssen. – wst

Antwort

15

Wenn Namespaces in Ihrem Anwendungsfall nicht wichtig sind, können Sie den Namespace-Platzhalterselektor *: verwenden, der Knoten ohne und mit beliebigen Namespaces auswählt.

könnte ein Beispiel Abfrage

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

Der Business Analyst muss noch die Wähler vor jedem Knotentest hinzufügen, aber es ist das gleiche „prefix“ die ganze Zeit und der einzige Fehler zu erwarten vergißt es irgendwo zu benutzen.

+0

Dies erwies sich als die einfachste Lösung für mein Problem - danke – reach4thelasers

+1

Danke dafür, das half mir, ein Problem zu lösen, wo mir der Namensraum egal war – GenuineRex

+0

Das ist Awesome! Ich arbeite in einer Datenbank (die von einer anderen Firma kontrolliert wird), wo ich die Daten oder das Schema nicht ändern kann und wir haben einige XML-Felder, die von einem Drittanbieter für Rezepte ausgefüllt werden. Es ist ein Durcheinander mit verschiedenen XML-Namensräumen. Dadurch können meine Abfragen wichtige Informationen unabhängig vom Namespace extrahieren, an dem sie sich an diesem Tag fühlten. – MikeTeeVee