Обратный к STRING_AGG

#sql #sql-server #split #cursor #string-agg

#sql #sql-сервер #разделить #курсор #строка-agg

Вопрос:

Вот пример данных, которые мы обрабатываем в дальнейшем.

 create table #tmp (id int identity(1,1), na varchar(10),me varchar(10))
insert into #tmp (na,me)
values 
('a','t'),
('a','u'),
('a','v'),
('a','w'),
('b','x'),
('b','y'),
('b','z')
select * from #tmp
  

Мой вопрос в том, существует ли какая-либо точная обратная STRING_AGG функция для SQL Server?

Например, я объединяю использование STRING_AGG со следующим кодом

 select na, STRING_AGG(me,',') as me into #tmp1 from #tmp group by na
select * from #tmp1
  

Мне нужно отменить процесс, но мне пришлось использовать КУРСОР, поэтому я ищу альтернативное решение.

Ниже приведен код курсора для лучшего понимания цели.

 declare @na varchar(10)
declare @me varchar(max)
create table #tmp3 (na varchar(10),me varchar(10))

declare dbc cursor for select na, me from #tmp1
open dbc

while 1=1
begin
    fetch next from dbc into @na, @me

    if @@FETCH_STATUS <> 0
        break;

    insert into #tmp3 (na,me)
    select @na, value
    from string_split(@me,',')
    
end

close dbc
deallocate dbc

select * from #tmp3

--Delete temp table

drop table #tmp
drop table #tmp1
drop table #tmp3
  

Комментарии:

1. string_split() не является точным обратным, поскольку не гарантируется сохранение порядка. Итак, это зависит от того, что вы хотите сделать.

Ответ №1:

Существует аналогичный string_split доступный, который можно использовать, например

для каждого string_agg использования cross apply мы можем преобразовать их обратно в строки,

 select na,c.value
  from 
(select na, string_agg(me,',') as me
   from #tmp 
  group by na
) t
cross apply string_split(me, ',') c;