Вот функция разделения строки на строки. Ниже приведен запрос к вашей таблице 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 'ý'. Если ваша ситуация позволяет это, вы можете предпочесть найти и исправить их, а не использовать внешнее соединение.
Вы можете написать простой цикл, чтобы вытащить нужные вам биты и поместить их в вашу базу данных. –
Примечание. Даже после того, как вы разделите значения, вам все равно придется перевести DateValue на фактический тип данных даты. –
Не могли бы вы объяснить немного больше причин, я полностью смущен :( –