Inne aktualne odpowiedzi nie wyjaśniają zbyt wiele, skąd to się bierze, lub po prostu oferują linki do źle sformatowanych witryn i tak naprawdę nie odpowiadają na pytanie.
W wielu odpowiedziach w Internecie dotyczących grupowania ciągów znajdują się odpowiedzi kopiuj wklej bez zbytniego wyjaśniania, co się dzieje. Chciałem lepiej odpowiedzieć na to pytanie, ponieważ zastanawiałem się nad tym samym, a także dać wgląd w to, co się właściwie dzieje.
tldr;
W skrócie, jest to składnia pomagająca przekształcić wyjście XML przy użyciu FOR XML PATH
który używa nazw kolumn (lub aliasów) do struktury danych wyjściowych. Jeśli nazwiesz swoją kolumnę text()
dane będą reprezentowane jako tekst w tagu głównym.
<row>
My record's data
<row>
W przykładach, które widzisz online, jak grupować ciągi i łączyć za pomocą ,
może to nie być oczywiste (poza tym, że twoje zapytanie ma tak mało for xml
część), że faktycznie budujesz plik XML o określonej strukturze (a raczej braku struktury) za pomocą FOR XML PATH ('')
. ('')
usuwa główne tagi xml i po prostu wypluwa dane.
Umowa z AS [text()]
Jak zwykle, AS
działa, aby nazwać lub zmienić nazwę aliasu kolumny. W tym przykładzie aliasujesz tę kolumnę jako [text()]
. []
s to po prostu standardowe ograniczniki kolumn SQL Server, często niepotrzebne, z wyjątkiem dzisiejszych czasów, gdy nasza nazwa kolumny ma ()
s. Pozostaje nam text()
dla naszej nazwy kolumny.
Kontrolowanie struktury XML za pomocą nazw kolumn
Kiedy używasz FOR XML PATH
wyprowadzasz plik XML i możesz kontrolować strukturę za pomocą nazw kolumn. Szczegółową listę opcji można znaleźć tutaj:https://msdn.microsoft .com/en-us/library/ms189885.aspx
Przykład obejmuje rozpoczęcie nazwy kolumny znakiem @, na przykład:
SELECT color as '@color', name
FROM #favorite_colors
FOR XML PATH
Spowoduje to przeniesienie danych tej kolumny do atrybutu bieżącego wiersza XML, a nie do elementu w nim zawartego. Skończysz z
<row color="red">
<name>tim</name>
</row>
<row color="blue">
<name>that guy</name>
</row>
Wróćmy więc do [text()]
. W rzeczywistości jest to określenie Test węzła XPath
. W kontekście MS Sql Server możesz dowiedzieć się o tym oznaczeniu tutaj . Zasadniczo pomaga określić typ elementu, do którego dodajemy te dane, na przykład normalny węzeł (domyślnie), komentarz xml lub w tym przykładzie tekst w tagu.
Przykład użycia kilku ruchów do uporządkowania danych wyjściowych
SELECT
color as [@color]
,'Some info about ' + name AS [text()]
,name + ' likes ' + color AS [comment()]
,name
,name + ' has some ' + color + ' things' AS [info/text()]
FROM #favorite_colors
FOR XML PATH
Zauważ, że używamy kilku oznaczeń w nazwach naszych kolumn:
@color
:atrybut znacznikatext()
:trochę tekstu dla tego tagu głównegocomment()
:komentarz xmlinfo/text()
:jakiś tekst w określonym tagu xml,<info>
Wynik wygląda tak:
<row color="red">
Some info about tim
<!--tim likes red-->
<name>tim</name>
<info>tim has some red things</info>
</row>
<row color="blue">
Some info about that guy
<!--that guy likes blue-->
<name>that guy</name>
<info>that guy has some blue things</info>
</row>
Podsumowując, jak te narzędzia mogą grupować i łączyć ciągi znaków?
Tak więc dzięki rozwiązaniom, które widzimy dla grupowania ciągów razem za pomocą FOR XML PATH
, istnieją dwa kluczowe elementy.
AS [text()]
:Zapisuje dane jako tekst, zamiast zawijać je w znacznikFOR XML PATH ('')
:Zmienia nazwę głównego tagu na''
, a raczej całkowicie usuwa
Daje nam to wyjście „XML” (cytaty powietrzne), które jest zasadniczo tylko ciągiem.
SELECT name + ', ' AS [text()] -- no 'name' tags
FROM #favorite_colors
FOR XML PATH ('') -- no root tag
powraca
tim, that guy,
Stamtąd wystarczy połączyć te dane z powrotem do większego zestawu danych, z którego pochodzą.