sql >> Database >  >> RDS >> Sqlserver

FOR XML PATH in SQL server en [text()]

De andere huidige antwoorden verklaren niet veel over waar dit vandaan komt, of bieden alleen links naar slecht opgemaakte sites en beantwoorden de vraag niet echt.

In veel antwoorden op internet voor het groeperen van tekenreeksen zijn er de antwoorden voor kopiëren en plakken zonder veel uitleg over wat er aan de hand is. Ik wilde deze vraag beter beantwoorden omdat ik me hetzelfde afvroeg, en ook inzicht geven in wat er in het algemeen gebeurt.

tldr;

Kortom, dit is een syntaxis om de XML-uitvoer te helpen transformeren bij gebruik van FOR XML PATH die kolomnamen (of aliassen) gebruikt om de uitvoer te structureren. Als u uw kolom een ​​naam geeft text() de gegevens worden weergegeven als tekst in de root-tag.

<row>
    My record's data
<row>

In de voorbeelden die u online ziet voor het groeperen van strings en concat met , het is misschien niet voor de hand liggend (behalve het feit dat uw zoekopdracht dat kleine for xml heeft deel) dat u daadwerkelijk een XML-bestand bouwt met een specifieke structuur (of liever een gebrek aan structuur) door FOR XML PATH ('') te gebruiken . De ('') verwijdert de root xml-tags en spuugt gewoon de gegevens uit.

De deal met AS [text()]

Zoals gewoonlijk, AS handelt om de kolomalias een naam te geven of te hernoemen. In dit voorbeeld gebruikt u deze kolom als alias [text()] . De [] s zijn gewoon de standaard kolomscheidingstekens van SQL Server, vaak overbodig, behalve vandaag omdat onze kolomnaam () heeft s. Dat laat ons achter met text() voor onze kolomnaam.

De XML-structuur beheren met kolomnamen

Wanneer u FOR XML PATH . gebruikt u voert een XML-bestand uit en kunt de structuur bepalen met uw kolomnamen. Een gedetailleerde lijst met opties vindt u hier:https://msdn.microsoft .com/en-us/library/ms189885.aspx

Een voorbeeld is het starten van uw kolomnaam met een @-teken, zoals:

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

Dit zou de gegevens van deze kolom verplaatsen naar een attribuut van de huidige xml-rij, in tegenstelling tot een item erin. Je eindigt met

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

Dus dan, terug naar [text()] . Dit is eigenlijk het specificeren van een XPath Node Test . In de context van MS Sql Server kunt u hier . Het helpt in feite bij het bepalen van het type element waaraan we deze gegevens toevoegen, zoals een normaal knooppunt (standaard), een xml-opmerking of in dit voorbeeld wat tekst in de tag.

Een voorbeeld met een paar zetten om de uitvoer te structureren

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

Merk op dat we een paar aanduidingen gebruiken in onze kolomnamen:

  • @color :een tagkenmerk
  • text() :wat tekst voor deze root-tag
  • comment() :een xml-opmerking
  • info/text() :wat tekst in een specifieke xml-tag, <info>

De uitvoer ziet er als volgt uit:

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

Om het af te ronden, hoe kunnen deze tools strings groeperen en samenvoegen?

Dus met de oplossingen die we zien voor het groeperen van strings met behulp van FOR XML PATH , zijn er twee belangrijke componenten.

  • AS [text()] :schrijft de gegevens als tekst, in plaats van deze in een tag te wikkelen
  • FOR XML PATH ('') :hernoemt de root-tag naar '' , of liever, verwijdert het volledig

Dit geeft ons "XML" (lucht aanhalingstekens) output die in wezen slechts een string is.

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

retourneert

tim, that guy, 

Van daaruit is het gewoon een kwestie van die gegevens weer samenvoegen met de grotere dataset waaruit ze zijn voortgekomen.



  1. PHP DOM gebruiken om XML-bestanden te maken van MySQL-gegevens

  2. Een getal omzetten in een woord in Mysql

  3. SQL Hoe de waarden van select return te vervangen?

  4. Wanneer en hoe de SQL PARTITION BY-clausule te gebruiken?