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. 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-attributtekst()
:noget tekst til dette root-tagcomment()
:en xml-kommentarinfo/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 tagFOR 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.