Ostatní aktuální odpovědi příliš nevysvětlují, odkud to pochází, nebo jen nabízejí odkazy na špatně formátované stránky a ve skutečnosti na otázku neodpovídají.
V mnoha odpovědích na webu pro seskupování řetězců jsou odpovědi typu copy a past bez velkého vysvětlení toho, co se děje. Chtěl jsem na tuto otázku odpovědět lépe, protože mě zajímalo totéž, a také poskytnout náhled na to, co se vlastně celkově děje.
tldr;
Stručně řečeno, toto je syntaxe, která pomáhá transformovat výstup XML při použití FOR XML PATH
který používá názvy sloupců (nebo aliasy) ke strukturování výstupu. Pokud sloupec pojmenujete text()
data budou reprezentována jako text v kořenové značce.
<row>
My record's data
<row>
V příkladech, které vidíte online, jak seskupit řetězce a spojit pomocí ,
nemusí to být zřejmé (kromě skutečnosti, že váš dotaz obsahuje málo for xml
část), že ve skutečnosti vytváříte soubor XML se specifickou strukturou (nebo spíše chybějící strukturou) pomocí FOR XML PATH ('')
. ('')
odstraňuje kořenové xml tagy a jen vyplivuje data.
Dohoda s AS [text()]
Jako obvykle AS
jedná, aby pojmenoval nebo přejmenoval alias sloupce. V tomto příkladu vytváříte alias tohoto sloupce jako [text()]
. []
s jsou prostě standardní oddělovače sloupců SQL Serveru, často nepotřebné, kromě dneška, protože název našeho sloupce má ()
s. Zbývá nám tedy text()
pro název našeho sloupce.
Ovládání struktury XML pomocí názvů sloupců
Když používáte FOR XML PATH
vytváříte soubor XML a můžete řídit strukturu pomocí názvů sloupců. Podrobný seznam možností naleznete zde:https://msdn.microsoft .com/en-us/library/ms189885.aspx
Příkladem je začátek názvu sloupce znakem @, například:
SELECT color as '@color', name
FROM #favorite_colors
FOR XML PATH
Tím by se data tohoto sloupce přesunula do atributu aktuálního řádku xml, nikoli do položky v něm. Skončíte s
<row color="red">
<name>tim</name>
</row>
<row color="blue">
<name>that guy</name>
</row>
Pak se vraťte k [text()]
. Toto ve skutečnosti určuje test uzlu XPath
. V kontextu MS Sql Server se o tomto označení můžete dozvědět zde . V zásadě to pomáhá určit typ prvku, do kterého tato data přidáváme, jako je normální uzel (výchozí), komentář xml nebo v tomto příkladu nějaký text ve značce.
Příklad využívající několik pohybů ke strukturování výstupu
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
Všimněte si, že v názvech sloupců používáme několik označení:
@color
:atribut značkytext()
:nějaký text pro tuto kořenovou značkucomment()
:xml komentářinfo/text()
:nějaký text ve specifické značce xml,<info>
Výstup vypadá takto:
<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>
Když to shrnu, jak mohou tyto nástroje seskupovat a spojovat řetězce?
Takže s řešeními, která vidíme pro seskupování řetězců pomocí FOR XML PATH
, existují dvě klíčové složky.
AS [text()]
:Zapíše data jako text, místo aby je obalila tagemFOR XML PATH ('')
:Přejmenuje kořenovou značku na''
, nebo spíše ji zcela odstraní
To nám dává výstup „XML“ (vzduchové uvozovky), který je v podstatě jen řetězec.
SELECT name + ', ' AS [text()] -- no 'name' tags
FROM #favorite_colors
FOR XML PATH ('') -- no root tag
vrací
tim, that guy,
Odtud je to jen otázka spojení těchto dat zpět do větší datové sady, ze které pochází.