2013-08-06 20 views
5

Ho un po 'di dati XML in una tabella di SQL Server in una colonna XML come segue:SQL Server XQuery con namespace di default

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

noterete che alcuni degli elementi hanno un attributo xmlns e un po' non ...

Ho bisogno di scrivere query per restituire i dati e, cosa più importante, mostrare a un analista di business come scrivere le proprie query per ottenere i dati di cui ha bisogno, quindi voglio che sia il più semplice possibile.

posso interrogare i dati in modo semplice utilizzando l'elemento con XMLNAMESPACES come segue:

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] 

Ma aggiungendo la x: parte alla query lo fa apparire troppo complicato, e voglio mantenere le cose semplici per il business analista.

Ho provato ad aggiungere:

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

e rimuovendo la x: dal XQuery - ma questo restituisce un valore nullo

C'è qualche (forse a causa della mancanza dei xmlns sull'elemento root?) modo in cui posso semplificare queste query con o senza lo spazio dei nomi predefinito?

+0

destro, il problema è che '' non è in uno spazio dei nomi, in modo che quando si esegue una query elementi nel 'urn: callcredit.co.uk ...' namespace di default, non si riesce a selezionarlo. Purtroppo non c'è modo di assegnare un prefisso a no-namespace, quindi penso che si deve utilizzare prefissi sugli elementi namespace. – wst

risposta

15

Se gli spazi dei nomi non sono importanti nel proprio caso d'uso, è possibile utilizzare il selettore di caratteri jolly namespace *:, che seleziona entrambi i nodi senza e con spazi dei nomi arbitrari.

Una query di esempio potrebbe essere

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

L'analista di business avrà ancora aggiungere il selettore di fronte ad ogni test di nodo, ma è lo stesso "prefisso" tutto il tempo e l'unico errore da aspettarselo sta dimenticando di usarlo da qualche parte.

+0

Questa si è rivelata la soluzione più semplice per il mio problema - grazie – reach4thelasers

+1

Grazie per questo, questo mi ha aiutato a risolvere il problema per cui non mi interessa lo spazio dei nomi – GenuineRex

+0

questo è impressionante! Io lavoro in una banca dati (controllata da un'altra società) in cui non posso modificare i dati o lo schema e abbiamo alcuni campi XML che sono popolate da un 3rd-party per le prescrizioni. È un casino con vari Namepace XML. Ciò consente alle mie query di estrarre informazioni importanti indipendentemente dallo spazio dei nomi che si desideravano utilizzare quel giorno. – MikeTeeVee