Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

ЗА XML PATH в SQL сървър и [text()]

Другите настоящи отговори не обясняват много за това откъде идва това или просто предлагат връзки към зле форматирани сайтове и всъщност не отговарят на въпроса.

В много отговори в мрежата за групиране на низове има отговори за копиране и поставяне без много обяснения какво се случва. Исках да отговоря по-добре на този въпрос, защото се чудех същото, а също така да дам представа какво всъщност се случва като цяло.

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, 

Оттам нататък е само въпрос на присъединяване на тези данни към по-големия набор от данни, от който идват.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Оптимизаторът на плана за заявки работи ли добре с обединени/филтрирани таблични функции?

  2. Определете дали файлът е празен (SSIS)

  3. Запитване за xml в sql сървър 2008

  4. Трябва ли да използвам тип данни SQL_Variant?

  5. DATEDIFF във формат ЧЧ:ММ:СС