Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

FOR XML PATH w serwerze SQL i [text()]

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 znacznika
  • text() :trochę tekstu dla tego tagu głównego
  • comment() :komentarz xml
  • info/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 znacznik
  • FOR 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ą.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Problem z połączeniem z serwerem sql Logowanie nie powiodło się. Login pochodzi z niezaufanej domeny i nie może być używany z uwierzytelnianiem Windows

  2. Jak oskryptować rolę bazy danych serwera SQL?

  3. Import funkcji EF nie rozpoznaje kolumn zwróconych przez StoredProc

  4. Problem z utworzeniem dwóch kolumn tożsamości w jednej tabeli

  5. Do czego służy SYNONYM?