Patrząc na moje pole XML, moje wiersze wyglądają następująco:
<person><firstName>Jon</firstName><lastName>Johnson</lastName></person>
<person><firstName>Kathy</firstName><lastName>Carter</lastName></person>
<person><firstName>Bob</firstName><lastName>Burns</lastName></person>
Zauważ, że są to trzy wiersze w mojej tabeli.
Chciałbym zwrócić wynik SQL w postaci tabeli, jak w
Jon | Johnson
Kathy| Carter
Bob | Burns
Jakie zapytanie to umożliwi?
sql-server
xml
xpath
Larsenal
źródło
źródło
Odpowiedzi:
Biorąc pod uwagę, że pole XML nosi nazwę „xmlField” ...
źródło
The XQuery syntax '/function()' is not supported.
:; Z drugiej strony @Remus Rusanu wydaje się to robić :)<BAM><Type>Electrical</Type><BaIds><a:int>7330</a:int></BaIds></BAM>
, mój wybór toselect e.MessageData.value('(/BAM/Type)[1]', 'varchar(100)')
. Próbowałem również selecte.MessageData.value('(/BAM/Type/node())[1]', 'varchar(100)')
, i'(//Type/node())[1]'
,'(./Type)[1]'
i każda inna kombinacja mogę myśleć. Wszystko, co kiedykolwiek otrzymałem, toNULL
.Biorąc pod uwagę, że dane XML pochodzą z tabeli „tabela” i są przechowywane w kolumnie „pole”: użyj rozszerzenia metod XML , wyodrębnij wartości za pomocą
xml.value()
, węzły projektu za pomocąxml.nodes()
, użyj,CROSS APPLY
aby połączyć:Możesz porzucić
nodes()
i,cross apply
jeśli każde pole zawiera dokładnie jeden element „osoba”. Jeśli XML jest wybraną zmiennąFROM @variable.nodes(...)
i nie potrzebujesz rozszerzeniacross apply
.źródło
Ten post był pomocny w rozwiązaniu mojego problemu, który ma trochę inny format XML ... mój XML zawiera listę kluczy, jak w poniższym przykładzie, a ja przechowuję XML w kolumnie SourceKeys w tabeli o nazwie DeleteBatch:
Utwórz tabelę i wypełnij ją danymi:
Oto mój SQL do wybierania kluczy z XML:
Oto wyniki zapytania ...
źródło
To może odpowiedzieć na twoje pytanie:
źródło
Cholera. To był naprawdę przydatny wątek do odkrycia.
Nadal uważam, że niektóre z tych sugestii są mylące. Za każdym razem, gdy użyłem znaku
value
with[1]
w ciągu, pobierałbym tylko pierwszą wartość. I niektóre sugestie zalecały użycie,cross apply
które (w moich testach) po prostu przywróciło zbyt dużo danych.Oto mój prosty przykład, jak utworzyć
xml
obiekt, a następnie odczytać jego wartości w tabeli.A oto wynik:
Jest to dziwaczna składnia, ale z przyzwoitym przykładem wystarczy dodać do własnych funkcji SQL Server.
A skoro o tym mowa, oto poprawna odpowiedź na to pytanie.
Zakładając, że masz swoje dane xml w
@xml
zmiennej typuxml
(jak pokazano w moim przykładzie powyżej), oto jak możesz zwrócić trzy wiersze danych z xml cytowanego w pytaniu:źródło
[1]
porządkowego indeksu, aby zmusić go do zwrócenia 1 wiersza, albo musisz zastosować krzyżowo kolumnę z,nodes()
aby uzyskać struktura, która może mieć przeciwko niej działanie xpath. Twój kod nie przekłada się na taki scenariusz bez wielu modyfikacji. Używasz zmiennej, a nie kolumny tabeli. Nadużywasz równieżquery()
funkcji, która zwraca xml. np. możesz mieć tylkox.Rec.value('(./firstName)[1]', 'nvarchar(2000)') AS FirstName
Jeśli jesteś w stanie zawinąć swój XML w element główny - powiedz, że masz następujące rozwiązanie:
źródło
MSSQL używa zwykłych reguł XPath w następujący sposób:
W3Schools
źródło
źródło
/ * W tym przykładzie użyto zmiennej XML ze schematem * /
źródło