Wenn ich nur mein XML-Feld betrachte, sehen meine Zeilen folgendermaßen aus:
<person><firstName>Jon</firstName><lastName>Johnson</lastName></person>
<person><firstName>Kathy</firstName><lastName>Carter</lastName></person>
<person><firstName>Bob</firstName><lastName>Burns</lastName></person>
Beachten Sie, dass dies drei Zeilen in meiner Tabelle sind.
Ich möchte ein SQL-Ergebnis als Tabelle wie in zurückgeben
Jon | Johnson
Kathy| Carter
Bob | Burns
Welche Abfrage wird dies erreichen?
sql-server
xml
xpath
Larsenal
quelle
quelle
Antworten:
Vorausgesetzt, das XML-Feld heißt 'xmlField' ...
quelle
The XQuery syntax '/function()' is not supported.
; Auf der anderen Seite scheint @Remus Rusanu es zu tun :)<BAM><Type>Electrical</Type><BaIds><a:int>7330</a:int></BaIds></BAM>
, meine Auswahl istselect e.MessageData.value('(/BAM/Type)[1]', 'varchar(100)')
. Ich habe auch selecte.MessageData.value('(/BAM/Type/node())[1]', 'varchar(100)')
, and'(//Type/node())[1]'
,'(./Type)[1]'
und jede andere Kombination ausprobiert , die mir einfällt. Alles was ich jemals bekomme istNULL
.Berücksichtigen Sie, dass XML-Daten aus einer Tabelle 'Tabelle' stammen und in einer Spalte 'Feld' gespeichert sind: Verwenden Sie die XML-Methoden , extrahieren Sie Werte mit
xml.value()
, Projektknoten mitxml.nodes()
, verwenden SieCROSS APPLY
zum Verbinden:Sie können das
nodes()
und weglassen,cross apply
wenn jedes Feld genau ein Element 'Person' enthält. Wenn das XML eine Variable ist, die Sie auswählenFROM @variable.nodes(...)
und die Sie nicht benötigencross apply
.quelle
Dieser Beitrag war hilfreich, um mein Problem zu lösen, das ein etwas anderes XML-Format hat. Mein XML enthält eine Liste von Schlüsseln wie im folgenden Beispiel und ich speichere das XML in der SourceKeys-Spalte in einer Tabelle mit dem Namen DeleteBatch:
Erstellen Sie die Tabelle und füllen Sie sie mit einigen Daten:
Hier ist mein SQL, um die Schlüssel aus dem XML auszuwählen:
Hier sind die Abfrageergebnisse ...
quelle
Dies kann Ihre Frage beantworten:
quelle
Blimey. Dies war ein wirklich nützlicher Thread zu entdecken.
Ich fand einige dieser Vorschläge immer noch verwirrend. Wann immer ich
value
mit[1]
in der Zeichenfolge verwendet habe, wurde nur der erste Wert abgerufen. Und einige Vorschläge empfahlen, mitcross apply
denen (in meinen Tests) einfach viel zu viele Daten zurückgebracht wurden.Hier ist mein einfaches Beispiel, wie Sie ein
xml
Objekt erstellen und dann seine Werte in eine Tabelle einlesen.Und hier ist die Ausgabe:
Es ist eine bizarre Syntax, aber mit einem anständigen Beispiel ist es einfach genug, Ihre eigenen SQL Server-Funktionen zu erweitern.
Apropos, hier ist die richtige Antwort auf diese Frage.
Angenommen, Sie haben Ihre XML-Daten in einer
@xml
Variablen vom Typxml
(wie in meinem obigen Beispiel gezeigt), so würden Sie die drei Datenzeilen aus der in der Frage angegebenen XML-Datei zurückgeben:quelle
[1]
die Index-Ordnungszahl verwenden, um die Rückgabe einer Zeile zu erzwingen, oder Sie müssen die Spalte kreuzennodes()
, um eine zu erhalten Struktur, gegen die xpath ausgeführt werden kann. Ihr Code lässt sich ohne viele Änderungen nicht in dieses Szenario übersetzen. Sie verwenden eine Variable, keine Tabellenspalte. Sie verwenden auch einequery()
Funktion, die XML zurückgibt. zB könnten Sie gerade habenx.Rec.value('(./firstName)[1]', 'nvarchar(2000)') AS FirstName
Wenn Sie in der Lage sind, Ihr XML in ein Stammelement zu verpacken, ist Folgendes die Lösung:
quelle
MSSQL verwendet reguläre XPath-Regeln wie folgt:
W3Schools
quelle
quelle
/ * In diesem Beispiel wird eine XML-Variable mit einem Schema verwendet * /
quelle