Как оптимально разложить строку на составляющие?

KIM
Дата: 05.12.2002 13:33:59
Работаем с MSSQL2000 SP2. Имеем строку, заполненную числами через запятую.
В произвольных местах строки возможно наличие пробелов:
DECLARE @s varchar(128)

SET @s=' 3,5, 8,13,21 ,34,55 '

Такую строку надо разложить на входящие в нее числа, т.е. получить такой набор строк:
N

---

3
5
8
13
21
34
55

Какие могут быть варианты решения?
Александр Азаркович
Дата: 05.12.2002 13:41:37
CREATE FUNCTION [dbo].[fnParseIDs] (@IDs varchar(8000))  

RETURNS @res table (id int)
AS
BEGIN
declare @p int
declare @id varchar(10)
declare @c char(1), @asci int
declare @len int
set @len=len(@IDs)
set @p=1
set @id=''
while @p<=@len
begin
set @c=substring(@IDs,@p,1)
set @asci=ascii(@c)
if @asci<48 or @asci>57
begin
if not @id=''
begin
insert @res values (cast(@id as int))
set @n=@n+1
set @id=''
end
end
else
set @id=@id+@c
set @p=@p+1
end
if not @id=''
insert @res values (cast(@id as int))
return
END
Александр Азаркович
Дата: 05.12.2002 13:43:37
P.S. Это у Вас ряд Фибоначчи, кажется? :)
KIM
Дата: 05.12.2002 13:47:57
2Александр Азаркович
Спасибо.
Ага, Фибоначчи. :)
akuz
Дата: 05.12.2002 14:11:29
CREATE FUNCTION SPLIT (

@string varchar(8000),
@delimeter varchar(1) = ',')
RETURNS @ret TABLE (id int PRIMARY KEY)
AS
BEGIN
DECLARE @s int, @e int

SET @s = 0
WHILE CHARINDEX(@delimeter,@string,@s) <> 0
BEGIN
SET @e = CHARINDEX(@delimeter,@string,@s)
INSERT @ret VALUES (CONVERT(int,SUBSTRING(@string,@s,@e - @s)))
SET @s = @e + 1
END
INSERT @ret VALUES (CONVERT(int,SUBSTRING(@string,@s,8000)))
RETURN
END
MiCe
Дата: 05.12.2002 14:20:07
мне понравился такой вариант....
DECLARE @s varchar(128)

SET @s=' 3,5, 8,13,21 ,34,55 '
set @s=REPLACE(@s,',',' union all select ')
exec ('select '+@s)
KIM
Дата: 05.12.2002 14:24:33
2MiCe
Королева в восхищении! :)
tpg
Дата: 05.12.2002 14:54:05
MiCe

Действительно, КРАСИВО!!!
mahoune
Дата: 05.12.2002 15:02:37
Предлагаю организовать доску почета! Будем на нее прибивать красивые решения и их авторов (заодно)
tpg
Дата: 05.12.2002 15:13:20
Предлагаю организовать доску почета! Будем на нее прибивать красивые решения и их авторов (заодно)

Я поддерживаю mahoune!