2016-05-15 3 views
1

Я искал решение в StackOverflow, но не нашел ничего полезного. Я столкнулся с проблемой, и я надеюсь, что кто-то захочет помочь мне.Разделение нескольких ограниченных значений на несколько строк

У меня есть значение как это:

Create table DemoRecords 
(
    CustID int identity (1,1), 
    CustomerName varchar(50), 
    CurrencyCode varchar(50), 
    CurrentBalance varchar(50), 
    DateValue varchar(50) 
) 
GO 

INSERT INTO DemoRecords VALUES ('Mr. X', 'BDTýUSDýGBP','10500ý2500ý1050','20150101ý20150201ý20150301') 

..и мне нужно вывод вроде этого: (Пожалуйста, обратите внимание на рисунок прилагается ниже)

enter image description here Picture

Пожалуйста, не 't предлагаю мне использовать CTE, потому что в этой таблице содержится более 100 столбцов.

+0

Вы можете написать простой цикл, чтобы вытащить нужные вам биты и поместить их в вашу базу данных. –

+0

Примечание. Даже после того, как вы разделите значения, вам все равно придется перевести DateValue на фактический тип данных даты. –

+0

Не могли бы вы объяснить немного больше причин, я полностью смущен :( –

ответ

2

Вот функция разделения строки на строки. Ниже приведен запрос к вашей таблице demorecords, которая использует эту функцию для получения запрошенного результата.

create function dbo.split 
(
    @delimited nvarchar(max), 
    @delimiter nvarchar(5) 
) 
returns @rows table 
(
    rownumber int not null identity(1,1), 
    value nvarchar(max) not null 
) 
as 
begin 
    if @delimited is null return 

    declare @delr_len int = len(@delimiter) 
    declare @start_at int = 1 
    declare @end_at int 
    declare @deld_len int 

    while 1=1 
    begin 
     set @end_at = charindex(@delimiter,@delimited,@start_at) 
     set @deld_len = case @end_at when 0 then len(@delimited) else @[email protected]_at end 
     insert into @rows (value) values(substring(@delimited,@start_at,@deld_len)); 
     if @end_at = 0 break; 
     set @start_at = @end_at + @delr_len 
    end 

    return 
end 
go 


select custid, customername, currencycode=currencycode.value, currentbalance=currentbalance.value, datevalue=datevalue.value 
    from demorecords r 
    cross apply (select rownumber, value from dbo.split(r.currencycode,'ý')) currencycode 
    cross apply (select rownumber, value from dbo.split(r.currentbalance,'ý') where rownumber = currencycode.rownumber) currentbalance 
    cross apply (select rownumber, value from dbo.split(r.datevalue,'ý') where rownumber = currencycode.rownumber) datevalue 

Если у вас есть столбец, который может содержать пропущенные значения, используйте внешний применить вместо внутреннего применить, чтобы присоединиться к результату функции для этого столбца. В следующем примере столбец DateValue отсутствует значение 3 и значение 4.

INSERT INTO DemoRecords VALUES ('Mr. X', 'BDTýUSDýGBPýEUR','10500ý2500ý1050ý','ý') 

select custid, customername, currencycode=currencycode.value, currentbalance=currentbalance.value, datevalue=datevalue.value 
from demorecords r 
cross apply (select rownumber, value from dbo.split(r.currencycode,'ý')) currencycode 
cross apply (select rownumber, value from dbo.split(r.currentbalance,'ý') where rownumber = currencycode.rownumber) currentbalance 
outer apply (select rownumber, value from dbo.split(r.datevalue,'ý') where rownumber = currencycode.rownumber) datevalue 

В качестве альтернативы, вы можете очистить ваш вход не пропускать значения. В приведенном выше примере я ожидал бы, что DateValue будет 'ýýý' not 'ý'. Если ваша ситуация позволяет это, вы можете предпочесть найти и исправить их, а не использовать внешнее соединение.

+0

Спасибо много Мэтт Дольфин :) –

+0

Дорогой Мэтт, у меня сценарий. Не могли бы вы запустить свою функцию по этим ниже данным и посмотреть, что произойдет. INSERT INTO DemoRecords VALUES ('Mr. X', 'BDTýUSDýGBPýEUR', '10500ý2500ý1050ý', 'ý'). рябь не совпадает с другими столбцами, поэтому не получается ожидаемый результат. –

+0

@Sajid Wasim, в вашем последнем сценарии DateValue не имеет третьего и четвертого значений. Я ожидаю, что это будет иметь значение «ýýý», а не «ý». Вы можете просто использовать внешнее применение вместо внутреннего, чтобы присоединиться к результату функции для этого столбца. См. Мой обновленный ответ. Или вы можете очистить свой ввод, чтобы иметь правильное количество столбцов. –

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