Другите настоящи отговори не обясняват много за това откъде идва това или просто предлагат връзки към зле форматирани сайтове и всъщност не отговарят на въпроса.
В много отговори в мрежата за групиране на низове има отговори за копиране и поставяне без много обяснения какво се случва. Исках да отговоря по-добре на този въпрос, защото се чудех същото, а също така да дам представа какво всъщност се случва като цяло.
tldr;
Накратко, това е синтаксис за подпомагане на трансформирането на XML изхода при използване на FOR XML PATH
който използва имена на колони (или псевдоними), за да структурира изхода. Ако назовете колоната си text()
данните ще бъдат представени като текст в основния таг.
<row>
My record's data
<row>
В примерите, които виждате онлайн за групиране на низове и свързване с ,
може да не е очевидно (с изключение на факта, че вашата заявка има този малък for xml
част), че всъщност създавате XML файл със специфична структура (или по-скоро липса на структура), като използвате FOR XML PATH ('')
. ('')
премахва основните xml тагове и просто изплюва данните.
Сделката с AS [text()]
Както обикновено, AS
действа, за да наименува или преименува псевдонима на колоната. В този пример вие задавате псевдоним на тази колона като [text()]
. []
s са просто стандартните разделители на колони на SQL Server, често ненужни, освен днес, тъй като името на нашата колона има ()
с. Това ни оставя с text()
за името на нашата колона.
Управление на XML структурата с имена на колони
Когато използвате FOR XML PATH
вие извеждате XML файл и можете да контролирате структурата с имената на вашите колони. Подробен списък с опции можете да намерите тук:https://msdn.microsoft .com/en-us/library/ms189885.aspx
Пример включва започване на името на колоната ви със знак @, като например:
SELECT color as '@color', name
FROM #favorite_colors
FOR XML PATH
Това ще премести данните на тази колона към атрибут на текущия xml ред, за разлика от елемент в него. Завършвате с
<row color="red">
<name>tim</name>
</row>
<row color="blue">
<name>that guy</name>
</row>
И така, обратно към [text()]
. Това всъщност указва XPath Node Test
. В контекста на MS Sql Server можете да научите за това обозначение тук . По принцип това помага да се определи типа елемент, към който добавяме тези данни, като нормален възел (по подразбиране), xml коментар или в този пример някакъв текст в тага.
Пример с няколко хода за структуриране на изхода
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
Забележете, че използваме няколко обозначения в имената на нашите колони:
@color
:атрибут на етикетtext()
:някакъв текст за този основен маркерcomment()
:xml коментарinfo/text()
:някакъв текст в конкретен xml таг,<info>
Резултатът изглежда така:
<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>
Завършвайки, как тези инструменти могат да групират и свързват низове?
И така, с решенията, които виждаме за групиране на низове заедно с помощта на FOR XML PATH
, има два ключови компонента.
AS [text()]
:Записва данните като текст, вместо да ги опакова в тагFOR XML PATH ('')
:Преименува коренния таг на''
, или по-скоро го премахва изцяло
Това ни дава "XML" (въздушни кавички) изход, който по същество е просто низ.
SELECT name + ', ' AS [text()] -- no 'name' tags
FROM #favorite_colors
FOR XML PATH ('') -- no root tag
връща
tim, that guy,
Оттам нататък е само въпрос на присъединяване на тези данни към по-големия набор от данни, от който идват.