2011-01-12 2 views
0

Wir haben eine Spalte in einer Tabelle, die ein Vielfaches xml und ist Setup als Nicht-Schema basiert XML-SpalteWas ist der Unterschied zwischen diesen beiden SQL Server XQuery-Abfragen?

Die Daten enthält Instanz eines Knotens, der so aussieht enthalten:

<eq:Fund> 
    <v:FundCode> 
    <v:type>SEDOL</v:type> 
    <v:value>3049141</v:value> 
    </v:FundCode> 
</eq:Fund> 
<eq:Fund> 
    <v:FundCode> 
    <v:type>Product Provider Specific</v:type> 
    <v:value>CASH</v:value> 
    </v:FundCode> 
</eq:Fund> 

Diese Abfrage liefert 448 Zeilen:

WITH XMLNAMESPACES ('http://schema1' as eq, 'http://schema2' as v, DEFAULT 'http://schema3') 
select * from xml_request 
WHERE xml_request_body.value('contains(string((//v:type)[1]),"SEDOL")','bit') = 1 

Diese Abfrage liefert 784 Zeilen (nach Leerzeichen in der Ergebnisspalte zu entfernen)

WITH XMLNAMESPACES ('http://schema1' as eq, 'http://schema2' as v, DEFAULT 'http://schema3') 
select xml_request.xml_request_ser, xml_request.agency_number, xml_request.policy_holder, xml_request.product, 
xml_request_body.query('for $x in /eq:EQuote/eq:Request/eq:Fund where $x/v:FundCode/v:type = "SEDOL" return $x') as result 
from xml_request 

1) Warum geben sie unterschiedliche Zeilenanzahl zurück? Die erste Abfrage findet nicht alle Zeilen, in denen das Element SEDOL enthält? Warum nicht?

Ich vermute es kann daran liegen, dass das Element mit SEDOL nicht das erste sein kann? 2) Wie ändere ich die erste Abfrage, um alle Elemente durchzusehen, nicht nur die ersten?

+0

Der erste Ausdruck ist ein ** boolescher ** Ausdruck. Daher wählt es keinen Knoten selbst aus. Sie verwenden eine bestimmte SLQ-Server-Methode, die den Evaluierungskontext dieses booleschen Ausdrucks definiert. Die zweite ist ein 'FLOWR' Ausdruck, der für sich selbst spricht. –

Antwort

1

[1] Die in der ersten Einrichtung, dass sie ausdrücklich die (in der Dokumentreihenfolge) erstetype Element erfordert für eine Übereinstimmung SEDOL, um zu enthalten, durchgeführt werden. Also ja, wenn, wie Sie sagen, einige Zeilen zuerst eine Nicht-SEDOL FundCode haben, werden sie nicht übereinstimmen.

Was möchten Sie den ersten Weg zu tun ist,

WHERE xml_request_body.exist('//v:type[contains(., "SEDOL")]') = 1 

Das für sieht jedev:type Element, so dass der Text SEDOL enthält.

Verwandte Themen