В чем смысл SELECT... FOR XML PATH (''), 1,1)?

Я изучаю sql в одном из question и здесь я видел использование этого, может ли какое-то тело заставить меня понять, что означает xml путь ('') в sql? и да, я просмотрел веб-страницы, я не очень хорошо это понял!

Я не получаю Stuff позади, теперь, что делает этот кусок кода (только select part)

declare @t table
(
    Id int,
    Name varchar(10)
)
insert into @t
select 1,'a' union all
select 1,'b' union all
select 2,'c' union all
select 2,'d' 

select ID,
stuff(
(
    select ','+ [Name] from @t where Id = t.Id for XML path('')
),1,1,'') 
from (select distinct ID from @t )t

Ответ 1

Здесь нет настоящей техники. Это просто симпатичный трюк, чтобы объединить несколько строк данных в одну строку. Это более причудливое использование функции, чем предполагаемое использование функции форматирования XML.

SELECT ',' + ColumnName ... FOR XML PATH('')

генерирует набор значений, разделенных запятыми, на основе объединения нескольких строк данных из столбца ColumnName. Он будет создавать значение, подобное ,abc,def,ghi,jkl.

STUFF(...,1,1,'')

Используется для удаления ведущей запятой, которую генерировал предыдущий трюк, см. STUFF для получения подробных сведений о его параметрах.

(Как ни странно, многие люди склонны ссылаться на этот метод создания набора значений, разделенных запятыми, как "метод STUFF", несмотря на то, что STUFF отвечает только за окончательный бит обрезки)

Ответ 2

SQL, на который вы ссылались, используется для конкатенации строк в MSSQL.

Он объединяет строки, добавляя ,, используя for xml path для результата ,a,b,c,d. Затем, используя stuff, он заменяет первый , для , удаляя его.

('') for xml path используется для удаления обертки node, которая автоматически создается. В противном случае это будет выглядеть как <row>,a,b,c,d</row>.

...
stuff(
  (
  select ',' + CAST(t2.Value as varchar(10)) from #t t2 where t1.id = t2.id 
  for xml path('')
  )
,1,1,'') as Value
...