Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как распарсить строку  [new]
Just_Serg
Member

Откуда:
Сообщений: 498
Коллеги, добрый день!

Есть задачка маленькая.

Есть у меня на входе переменная - строка = '123;234;345;456'
На выходе нужно получить табличку:

a
123
234
345
456

т.е. разделитель - ";"

Это можно как-то хитро сделать? или перебирать посимвольно придется?

Заранее благодарен за помощь!
5 июл 12, 16:27    [12823442]     Ответить | Цитировать Сообщить модератору
 Re: Как распарсить строку  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37077
https://www.sql.ru/forum/afsearch.aspx?s=%EC%E0%F1%F1%E8%E2%FB+%E8+%F1%EF%E8%F1%EA%E8&submit=%CD%E0%E9%F2%E8&bid=1
5 июл 12, 16:31    [12823467]     Ответить | Цитировать Сообщить модератору
 Re: Как распарсить строку  [new]
Max_Tpop
Member

Откуда:
Сообщений: 86
Just_Serg,

Когда то нашел, можешь использовать
+
declare @Parser Table (Value nvarchar (max))

declare @String Table (String nvarchar (max))
insert into @String
	   select '123;234;345;456'
select * from @String

DECLARE @pos		int,
        @textpos	int,
        @chunklen	smallint,
        @str		nvarchar(max),
        @tmpstr		nvarchar(max),
        @leftover	nvarchar(max),
        @List		nvarchar(max),
        @Delimiter	nvarchar(1),
        @LenList	int
 
set @textpos = 0
set @Delimiter = ';'
set @List = (select * from @String)
set @LenList = LEN(@List)
set @pos = CHARINDEX(@Delimiter,(select * from @String))
set @leftover = ''

if @LenList > CASE WHEN @pos = '' then @LenList else @pos - 1 end
begin
	while @textpos <= @LenList-@pos
	begin
		set @chunklen = @LenList - LEN(@leftover)
		set @tmpstr = LTRIM(@leftover + SUBSTRING(@List,@textpos,@chunklen))
		set @textpos = @textpos + @chunklen
		set @pos = CHARINDEX(@Delimiter,@tmpstr)
		
		while @pos >0
		begin
			set @str = SUBSTRING(@tmpstr,1,@pos-1)
			if LTRIM(RTRIM(@str))<> ''
				insert @Parser (Value) Values (@str)
			SET @tmpstr = LTRIM(SUBSTRING(@tmpstr, @pos + 1, LEN(@tmpstr)))
			SET @pos = CHARINDEX(@Delimiter, @tmpstr)
		end
		SET @leftover = @tmpstr
	end
	if LTRIM(RTRIM(@leftover))<>''
		insert @Parser (Value) Values (@leftover)
		select * from @Parser
end
else 
begin
	if LTRIM(RTRIM(@List))<>''
		insert into @Parser 
				select @List
		select * from @Parser
end	
5 июл 12, 17:55    [12824037]     Ответить | Цитировать Сообщить модератору
 Re: Как распарсить строку  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1359
Помогал такой примерчик:
6 июл 12, 08:36    [12826146]     Ответить | Цитировать Сообщить модератору
 Re: Как распарсить строку  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1359
-- Реализация функции Split на TSQL.
ALTER FUNCTION [dbo].[SplitString]( @String VARCHAR(8000), @Separator VARCHAR(1) = ',') RETURNS 
TABLE AS RETURN

SELECT	(N - 1) - LEN(REPLACE(LEFT(@String, N - 1), @Separator, '')) + 1 AS Position,
		SUBSTRING(@String, N, CHARINDEX(@Separator, @String + @Separator, N) - N) AS Element
FROM 
	( SELECT Row_Number() OVER (ORDER BY Год) N
	  FROM dbo.tCalendar 
	) Nums
WHERE N <= LEN(@String) + 1 AND SUBSTRING(@Separator + @String, N, 1) = @Separator;
6 июл 12, 08:37    [12826148]     Ответить | Цитировать Сообщить модератору
 Re: Как распарсить строку  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1359
p.s. В моём случае я использовал табличку "календарь", чтобы получить последовательность чисел от 1 до N. Можете предварительно её сгенерировать, или как удобно вам
6 июл 12, 08:39    [12826158]     Ответить | Цитировать Сообщить модератору
 Re: Как распарсить строку  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
declare @str varchar(100) = '123;234;345;456'

select substring( str, i2 + 1, i1 - i2 -1 ) str
  from  ( select @str as str    
             , charindex( ';', @str + ';', number ) i1     
             , case when number = 0 then 0 else charindex( ';', @str + ';', number - 1 ) end i2  
            from master.dbo.spt_values t2      
             where t2.type = 'P' and number between 0 and len( @str )
        ) t where i1 != i2
6 июл 12, 09:02    [12826255]     Ответить | Цитировать Сообщить модератору
 Re: Как распарсить строку  [new]
мимо
Guest
declare @xml as xml = cast('<b>' + replace('123;234;345;456',';','</b><b>') + '</b>'  as xml)

select x.value('.','int')
from @xml.nodes('b') as y(x)
6 июл 12, 09:37    [12826462]     Ответить | Цитировать Сообщить модератору
 Re: Как распарсить строку  [new]
Just_Serg
Member

Откуда:
Сообщений: 498
Спасибо всем большое!
6 июл 12, 11:18    [12827281]     Ответить | Цитировать Сообщить модератору
 Re: Как распарсить строку  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Можно ещё добавить, что если установлен FTS, то можно воспользоваться функцией sys.dm_fts_parser
6 июл 12, 12:05    [12827669]     Ответить | Цитировать Сообщить модератору
 Re: Как распарсить строку  [new]
user89
Member

Откуда:
Сообщений: 2083
Just_Serg,

12630368
6 июл 12, 14:58    [12829154]     Ответить | Цитировать Сообщить модератору
 Re: Как распарсить строку  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
Функция, которая делит строку на слова
6 июл 12, 15:43    [12829544]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить