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

SQL Server FOR XML Path прави повтарящи се възли

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

SELECT 
  t.col1 as 'item'
 ,NULL
 ,t.col2 as 'item'
 ,NULL
 ,t.col3 as 'item' 
FROM dbo.tbl as t 
FOR XML PATH('parent'), TYPE;

Резултат:

<parent>
  <item>1</item>
  <item>2</item>
  <item>3</item>
</parent>

SQL Fiddle

Защо това работи?

Колоните без име се вмъкват като текстови възли. В този случай стойността NULL се вмъква като текстов възел между item възли.

Ако добавите действителни стойности вместо NULL, ще видите какво се случва.

SELECT 
  t.col1 as 'item'
 ,'1'
 ,t.col2 as 'item'
 ,'2'
 ,t.col3 as 'item' 
FROM dbo.tbl as t 
FOR XML PATH('parent'), TYPE;

Резултат:

<parent>
  <item>1</item>1<item>2</item>2<item>3</item></parent>

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

Колони с име, посочено като заместващ знак

В този случай не е необходимо да използвате заместващия знак, тъй като колоните със стойности NULL нямат име на колона, но е полезно, когато искате стойности от действителни колони, но не искате името на колоната да бъде име на възел.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създаване на персонализирано изображение на SQL Server Docker върху официалното изображение

  2. Предаване на масив от ints към T-SQL съхранена процедура чрез структура на обекти

  3. Стойност на производителността на водачите COMB

  4. Как да коригирате „Изразът EXECUTE не бе успешен, защото неговата клауза WITH RESULT SETS посочи 2 колона(и) за набор от резултати...“ Msg 11537 в SQL Server

  5. Как да намеря текущото ниво на транзакция?