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

FOR XML PATH i SQL-server og [text()]

De andre aktuelle svar forklarer ikke meget om, hvor dette kommer fra, eller tilbyder bare links til dårligt formaterede sider og svarer ikke rigtigt på spørgsmålet.

I mange svar rundt omkring på nettet til gruppering af strenge er der copy paste-svarene uden en masse forklaring på, hvad der foregår. Jeg ville gerne besvare dette spørgsmål bedre, fordi jeg undrede mig over det samme, og også give indsigt i, hvad der rent faktisk sker generelt.

tldr;

Kort sagt er dette syntaks, der hjælper med at transformere XML-outputtet, når du bruger FOR XML PATH som bruger kolonnenavne (eller aliaser) til at strukturere outputtet. Hvis du navngiver din kolonne text() dataene vil blive repræsenteret som tekst i root-tagget.

<row>
    My record's data
<row>

I eksemplerne ser du online for, hvordan man grupperer strenge og sammensætter med , det er måske ikke indlysende (bortset fra det faktum, at din forespørgsel har den lille til xml del), at du faktisk bygger en XML-fil med en specifik struktur (eller rettere, mangel på struktur) ved at bruge FOR XML PATH ('') . ('') fjerner root xml tags og spytter bare dataene ud.

Aftalen med AS [text()]

Som sædvanlig, AS handler for at navngive eller omdøbe kolonnealiaset. I dette eksempel kalder du denne kolonne som [text()] . [] s er simpelthen SQL Servers standard kolonneafgrænsere, ofte unødvendige, undtagen i dag, da vores kolonnenavn har () s. Det efterlader os med text() for vores kolonnenavn.

Styring af XML-strukturen med kolonnenavne

Når du bruger FOR XML PATH du udskriver en XML-fil og kan styre strukturen med dine kolonnenavne. En detaljeret liste over muligheder kan findes her:https://msdn.microsoft .com/en-us/library/ms189885.aspx

Et eksempel inkluderer at starte dit kolonnenavn med et @-tegn, såsom:

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

Dette ville flytte denne kolonnes data til en attribut for den aktuelle xml-række i modsætning til et element i den. Du ender med

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

Så tilbage til [text()] . Dette angiver faktisk en XPath Node Test . I forbindelse med MS Sql Server kan du lære om denne betegnelse her . Grundlæggende hjælper det med at bestemme den type element, vi tilføjer disse data til, såsom en normal node (standard), en xml-kommentar eller i dette eksempel noget tekst i tagget.

Et eksempel med nogle få træk til at strukturere outputtet

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

Bemærk, at vi bruger nogle få betegnelser i vores kolonnenavne:

  • @color :en tag-attribut
  • tekst() :noget tekst til dette root-tag
  • comment() :en xml-kommentar
  • info/tekst() :noget tekst i et specifikt xml-tag,

Outputtet ser således ud:

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

Hvordan kan disse værktøjer gruppere og sammensætte strenge?

Så med de løsninger, vi ser for at gruppere strenge sammen ved hjælp af FOR XML PATH , der er to nøglekomponenter.

  • AS [text()] :Skriver dataene som tekst i stedet for at pakke dem ind i et tag
  • FOR XML-STI ('') :Omdøber root-tagget til '' , eller rettere sagt, fjerner det helt

Dette giver os "XML" (luftanførselstegn) output, der i det væsentlige kun er en streng.

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

returnerer

tim, that guy, 

Derfra er det bare et spørgsmål om at samle disse data tilbage til det større datasæt, som de kom fra.



  1. Rediger Django AutoField-startværdi

  2. rake db:create kodningsfejl med postgresql

  3. Læser klump linje for linje med pl\sql

  4. EF Code First Mysql til SQL Server