приведенное ниже решение приведено с данными образца, которые вы мне дали.
Сначала создайте временную таблицу и заполните ее данными.
-- Drop the table
drop table #member;
go
-- Sample table
create table #member
(
member_id int not null,
group_name varchar(256),
member_data varchar(8000)
);
go
-- Sample data
insert into #member values
(1, 'GRP1_ML_Unit1_Role1', 'GRP=User1,DC=com;GRP=User2,DC=com'),
(2, 'GRP2_ML_Unit2_Role2', 'GRP=User3,DC=com;GRP=User4,DC=com;GRP=User5,DC=com'),
(3, 'GRP3_ML_Unit3_Role3', 'GRP=User6,DC=com;GRP=User7,DC=com;GRP=User8,DC=com;GRP=User8,DC=com');
go
-- Show the data
select * from #member;
go
Во-вторых, скопируйте один из многочисленных разветвителей строк. В конце концов я установил строковый разделитель Джеффа Модена для строк размером 8 КБ.
Запрос почти есть. Однако каждый столбец, который мы хотим, представляет собой строку. Нам нужно динамически поворачивать таблицу.
--
-- Almost there!
--
-- Data in columns, instead of rows
select m.member_id, m.group_name, s.Item as cols_data, 'MEM' + cast(s.ItemNumber as varchar(6)) as cols_name from #member as m
CROSS APPLY dbo.DelimitedSplit8k(m.member_data,';') s
go
Последнее, но не менее важное: выяснить количество колонок. Напишите динамический TSQL, чтобы развернуть наш dat и получить наш результат.
--
-- Write dynamic sql to solve
--
DECLARE
@cols AS nvarchar(MAX),
@query AS nvarchar(MAX);
-- Get a dynamic number of columns
SET @cols = STUFF(
(
SELECT distinct ',' + QUOTENAME(c.cols_name)
FROM
(
select m.member_id, m.group_name, s.Item as cols_data, 'MEM' + cast(s.ItemNumber as varchar(6)) as cols_name from #member as m
CROSS APPLY dbo.DelimitedSplit8k(m.member_data,';') s
) as c
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
,1,1,'');
print @cols;
-- Make dynamic pivot query
set @query = 'SELECT member_id as ID1, group_name as GROUP1, ' + @cols + ' from
(
select m.member_id, m.group_name, s.Item as cols_data, ''MEM'' + cast(s.ItemNumber as varchar(6)) as cols_name from #member as m
CROSS APPLY dbo.DelimitedSplit8k(m.member_data, '';'') s
) x
pivot
(
max(cols_data)
for cols_name in (' + @cols + ')
) p ';
execute(@query)
Снимок экрана в нужном формате.
Посмотрите [здесь] (http://www.sommarskog.se/arrays-in-sql.html), чтобы узнать, как разделить в базе данных и искать 'PIVOT' для динамических столбцов (предполагается, что SQL -Server). –