2017-02-22 6 views
0

я следующая записьSQL для Split значения ячейки в строки

"NO" "EXECQTY" "PRNO" 
"WDNSLR/1" "10" "~PRSLR/00001~,~PRSLR/00002~,~PRSLR/00003~,~PRSLR/00004~" 

и хотят показать, как этого

"NO" "EXECQTY" "PRNO 

"WDNSLR/1" "10" "PRSLR/00001" 

"WDNSLR/1" "10" "PRSLR/00002 

"WDNSLR/1" "10" "PRSLR/00003 

"WDNSLR/1" "10" "PRSLR/00004 

Примечание
двойных кавычек использовать, чтобы показать, чтобы дифференцировать значение столбца

+0

это название колонки «NO» «EXECQTY» «PRNO' – TheGameiswar

+0

Да и PRNO Содержит несколько значений –

ответ

0

ОК, так что вам на самом деле нужно разбивать содержимое колонки PRNO на строки и присоединяя его к оригинальной таблице.

Это будет таблица:

declare @t table (NO varchar(20), EXECQTY varchar(20), PRNO varchar(100)) 
insert @t values ('WDNSLR/1', '10', '~PRSLR/00001~,~PRSLR/00002~,~PRSLR/00003~,~PRSLR/00004~') 

И это было бы код:

select t.no, t.execqty, replace(f.item, '~', '') as prno 
from @t t 
cross apply (
    select 
     item = ltrim(rtrim(substring(t.prno, [number], 
     charindex(',', t.prno + ',', [number]) - [number]))) 
    from (select number = row_number() over (order by name) from sys.all_objects) as x 
    where number <= len(t.prno) and substring(',' + t.prno, [number], len(',')) = ',' 
) f 

Это самодостаточный, но я предложил бы использовать реальную таблицу Numbers вместо создания последовательности каждый время на лету. Кроме того, подзапрос может быть легко преобразован в UDF.

+0

Спасибо! Успешно работаем. –

+0

Рад это слышать! Любая конкретная причина не принимать его тогда? – dean