Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

FOR XML PATH in SQL Server und [text()]

Die anderen aktuellen Antworten erklären nicht viel darüber, woher dies kommt, oder bieten nur Links zu schlecht formatierten Websites und beantworten die Frage nicht wirklich.

In vielen Antworten im Internet zum Gruppieren von Zeichenfolgen gibt es die Antworten zum Kopieren und Einfügen ohne viel Erklärung dafür, was los ist. Ich wollte diese Frage besser beantworten, weil ich mich dasselbe gefragt habe, und auch einen Einblick in das geben, was insgesamt tatsächlich passiert.

tldr;

Kurz gesagt, dies ist eine Syntax, die dabei hilft, die XML-Ausgabe umzuwandeln, wenn FOR XML PATH verwendet wird die Spaltennamen (oder Aliase) verwendet, um die Ausgabe zu strukturieren. Wenn Sie Ihre Spalte text() nennen die Daten werden als Text innerhalb des Root-Tags dargestellt.

<row>
    My record's data
<row>

In den Beispielen sehen Sie online, wie Sie Zeichenfolgen gruppieren und mit , verketten es ist vielleicht nicht offensichtlich (abgesehen von der Tatsache, dass Ihre Abfrage diesen kleinen for xml enthält Teil), dass Sie tatsächlich eine XML-Datei mit einer bestimmten Struktur (oder eher fehlender Struktur) erstellen, indem Sie FOR XML PATH ('') verwenden . Der ('') entfernt die Root-XML-Tags und spuckt die Daten einfach aus.

Der Deal mit AS [text()]

Wie immer AS handelt, um den Spaltenalias zu benennen oder umzubenennen. In diesem Beispiel aliasieren Sie diese Spalte als [text()] . Der [] s sind einfach die standardmäßigen Spaltentrennzeichen von SQL Server, die oft unnötig sind, außer heute, da unser Spaltenname () hat s. Damit bleibt uns text() für unseren Spaltennamen.

Steuern der XML-Struktur mit Spaltennamen

Wenn Sie FOR XML PATH verwenden Sie geben eine XML-Datei aus und können die Struktur mit Ihren Spaltennamen steuern. Eine detaillierte Liste der Optionen finden Sie hier:https://msdn.microsoft .com/en-us/library/ms189885.aspx

Ein Beispiel ist, dass Sie Ihren Spaltennamen mit einem @-Zeichen beginnen, z. B.:

SELECT color as '@color', name
FROM #favorite_colors
FOR XML PATH

Dies würde die Daten dieser Spalte in ein Attribut der aktuellen XML-Zeile verschieben, im Gegensatz zu einem Element darin. Sie enden mit

<row color="red">
  <name>tim</name>
</row>
<row color="blue">
  <name>that guy</name>
</row>

Also zurück zu [text()] . Dies spezifiziert eigentlich einen XPath-Knotentest . Im Zusammenhang mit MS Sql Server können Sie diese Bezeichnung hier . Grundsätzlich hilft es, den Elementtyp zu bestimmen, zu dem wir diese Daten hinzufügen, wie z. B. ein normaler Knoten (Standard), ein XML-Kommentar oder in diesem Beispiel Text innerhalb des Tags.

Ein Beispiel mit ein paar Handgriffen zur Strukturierung der Ausgabe

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

Beachten Sie, dass wir einige Bezeichnungen in unseren Spaltennamen verwenden:

  • @color :ein Tag-Attribut
  • text() :etwas Text für dieses Root-Tag
  • comment() :ein XML-Kommentar
  • info/text() :etwas Text in einem bestimmten XML-Tag, <info>

Die Ausgabe sieht so aus:

<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>

Abschließend, wie können diese Tools Strings gruppieren und verketten?

Also, mit den Lösungen, die wir sehen, um Strings mit FOR XML PATH zu gruppieren , gibt es zwei Schlüsselkomponenten.

  • AS [text()] :Schreibt die Daten als Text, anstatt sie in ein Tag zu packen
  • FOR XML PATH ('') :Benennt das Root-Tag in '' um , oder besser gesagt, entfernt es vollständig

Dies gibt uns eine "XML"-Ausgabe (Luftanführungszeichen), die im Wesentlichen nur eine Zeichenfolge ist.

SELECT name + ', ' AS [text()] -- no 'name' tags
FROM #favorite_colors
FOR XML PATH ('')  -- no root tag

zurück

tim, that guy, 

Von dort aus geht es nur noch darum, diese Daten wieder mit dem größeren Datensatz zu verknüpfen, aus dem sie stammen.