2013-10-01 3 views
0

У меня есть столбец данных со значениями вроде этого:Расщепление строка неограниченной длины SQL

Table1

ID|GROUPNAME   |MEMBER 
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 

Ожидаемый результат

ID|GRP1 |GRP2|GRP3 |GRP4 |MEM1   |MEM2   |MEM3   |MEM4|MEM5| 
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 | 

Спасибо, RYL

+0

Посмотрите [здесь] (http://www.sommarskog.se/arrays-in-sql.html), чтобы узнать, как разделить в базе данных и искать 'PIVOT' для динамических столбцов (предполагается, что SQL -Server). –

ответ

0

приведенное ниже решение приведено с данными образца, которые вы мне дали.

Сначала создайте временную таблицу и заполните ее данными.

-- 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) 

Снимок экрана в нужном формате. enter image description here

+0

Я хочу разделить также имя_группы, разделенное '_' – user2617053

+0

Это не было в исходной спецификации. Однако не беспокойтесь, добавьте замену в эту строку в коде: CROSS APPLY dbo.DelimitedSplit8k (REPLACE (m.member_data, '_', ';'), ';') s. В динамической части добавьте лишний ', чтобы избежать цитаты. –

Смежные вопросы