Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

FOR XML PATH nel server SQL e [text()]

Le altre risposte attuali non spiegano molto da dove provenga, o offrono semplicemente collegamenti a siti mal formattati e non rispondono davvero alla domanda.

In molte risposte sul web per il raggruppamento di stringhe ci sono le risposte copia incolla senza molte spiegazioni su cosa sta succedendo. Volevo rispondere meglio a questa domanda perché mi chiedevo la stessa cosa e anche dare un'idea di ciò che sta effettivamente accadendo nel complesso.

tldr;

In breve, questa è la sintassi per aiutare a trasformare l'output XML quando si utilizza FOR XML PATH che utilizza i nomi di colonna (o alias) per strutturare l'output. Se assegni alla colonna il nome text() i dati verranno rappresentati come testo all'interno del tag radice.

<row>
    My record's data
<row>

Negli esempi vedi online come raggruppare stringhe e concatenare con , potrebbe non essere ovvio (tranne per il fatto che la tua query ha quel piccolo for xml parte) che stai effettivamente costruendo un file XML con una struttura specifica (o meglio, mancanza di struttura) utilizzando FOR XML PATH ('') . Il ('') sta rimuovendo i tag xml di root e semplicemente sputando i dati.

L'accordo con AS [text()]

Come al solito, AS sta agendo per nominare o rinominare l'alias di colonna. In questo esempio, stai alias questa colonna come [text()] . Il [] s sono semplicemente i delimitatori di colonna standard di SQL Server, spesso non necessari, tranne oggi poiché il nome della nostra colonna ha () S. Questo ci lascia con text() per il nome della nostra colonna.

Controllo della struttura XML con i nomi delle colonne

Quando stai usando FOR XML PATH stai emettendo un file XML e puoi controllare la struttura con i nomi delle tue colonne. Un elenco dettagliato delle opzioni è disponibile qui:https://msdn.microsoft. .com/en-us/library/ms189885.aspx

Un esempio include l'inizio del nome della colonna con un segno @, ad esempio:

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

Ciò sposterebbe i dati di questa colonna in un attributo della riga xml corrente, anziché in un elemento al suo interno. Finisci con

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

Quindi, torna a [text()] . Questo in realtà sta specificando un Test del nodo XPath . Nel contesto di MS Sql Server, puoi conoscere questa designazione qui . Fondamentalmente aiuta a determinare il tipo di elemento a cui stiamo aggiungendo questi dati, come un nodo normale (predefinito), un commento xml o, in questo esempio, del testo all'interno del tag.

Un esempio che utilizza alcune mosse per strutturare l'output

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

Nota che stiamo usando alcune designazioni nei nomi delle nostre colonne:

  • @color :un attributo di tag
  • text() :del testo per questo tag radice
  • comment() :un commento xml
  • info/text() :del testo in uno specifico tag xml, <info>

L'output è simile a questo:

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

In conclusione, come possono questi strumenti raggruppare e concatenare stringhe?

Quindi, con le soluzioni che vediamo per raggruppare le stringhe usando FOR XML PATH , ci sono due componenti chiave.

  • AS [text()] :scrive i dati come testo, invece di racchiuderli in un tag
  • FOR XML PATH ('') :Rinomina il tag radice in '' , o meglio, lo rimuove del tutto

Questo ci dà un output "XML" (virgolette aeree) che è essenzialmente solo una stringa.

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

resi

tim, that guy, 

Da lì, si tratta solo di unire quei dati al set di dati più ampio da cui provengono.