2015-02-05 5 views
0

У меня есть таблица SQL со столбцом, который содержит строку с ограничением по трубе, а некоторые из элементов между трубой - это диапазоны, такие как 191087..191089. Мне нужно разбить эти значения на список, и если этот элемент является диапазоном, мне нужно перечислить весь диапазон. Например, если элемент равен 191087..191089, мне нужно указать 191087,191088,191089.Как отделить столбец с разделителями, содержащий диапазоны?

Мне удалось получить до разделения значений столбцов в строках, используя приведенный ниже код, который я нашел в Code Project, 'ksababa' и немного изменил, но мне нужна помощь в дальнейшем сглаживании диапазона и перечислении всех значения между запросом в качестве части возвращаемого набора данных.

CREATE FUNCTION [dbo].[Split](@String varchar(8000), @Delimiter char(1))  
returns @temptable TABLE (items varchar(8000))  
as  
begin  
    declare @idx int  
    declare @slice varchar(8000)  

    select @idx = 1  
     if len(@String)<1 or @String is null return  

    while @idx!= 0  
    begin  
     set @idx = charindex(@Delimiter,@String)  
     if @idx!=0  
      set @slice = left(@String,@idx - 1)  
     else  
      set @slice = @String  

     if(len(@slice)>0) 
      insert into @temptable(Items) values(@slice)  

     set @String = right(@String,len(@String) - @idx)  
     if len(@String) = 0 break  
    end 
return  
end 

--#### Test data to play with 
create table #test (
    data varchar(1000), 
    fUND varchar(50) 
) 
go 
insert into #test values 
    ('Data|asdsad|sad','01') 
    insert into #test values 
    ('1012|1032|1127|1134|1136|1138..1139|1141|1200..1212|1214..1223|1921|5315','09') 
go 


--#### Cursor to list elements values of each value of fund. 
Declare c Cursor For Select Distinct fUND From #test t 
Open c 
DECLARE @Fund varchar(10); 
create table #test1 (
    Fund varchar(10), 
    Element varchar(10) 
) 

Fetch next From c into @Fund 


While @@Fetch_Status=0 Begin 

    DECLARE @SUH VARCHAR(2000); 
SET @SUH=(Select data from #test where fUND= @Fund); 


insert into #test1 
select @Fund , * from dbo.Split(@SUH,'|') 

    Fetch next From c into @Fund 
End 

Select * From #test1 
Drop table #test1 

Close c 
Deallocate c 
+2

Использование DelimitedSplit8k Джефф Moden, вероятно, лучше, это намного быстрее, см Http: //www.sqlservercentral.com/articles/Tally+Table/72993/ (код, найденный далеко внизу) –

ответ

0

Для диапазонов я думаю, вам нужно будет использовать либо таблицу чисел, либо таблицу таблиц. Затем вы можете присоединиться к первому и последнему значению и получить весь диапазон оттуда.

Вы можете найти примеры для подсчета таблицы там, который также используется в DelimitedSplit8k:

SQL, Auxiliary table of numbers

+0

Для более детального изучения таблицы таблиц см. статью Джеффа в SSC. http://www.sqlservercentral.com/articles/T-SQL/62867/ –

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

  • Нет связанных вопросов^_^