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

Откуда: ИТ-Олимп, 58.1-летний супермен
Сообщений: 3989
Дано:
Символьная строка в виде |aaa|bbb|ccc|ddd|eee|
Нужно разбить строку, получив отдельно значение aaa, bbb, ccc, ddd, eee.

Символы в строке разделяются символом |
Длина значений aaa,bbb,ccc,ddd,eee - переменная и не всегда равна 3-м знакам.
13 окт 04, 07:37    [1028387]     Ответить | Цитировать Сообщить модератору
 Re: Разбить символьную строку на составляющие  [new]
Luchkin Dmitry
Member

Откуда: Новосибирск -> Ангарск -> Братск -> Мск
Сообщений: 1921
declare @c varchar(1000)
select @c= '|aaa|bbb|ccc|ddd|eee|'
select @c= 'select '''+ replace(substring(@c, 2, len(@c)-2), '|', ''' union all select ''')+''''
exec (@c)
13 окт 04, 07:48    [1028402]     Ответить | Цитировать Сообщить модератору
 Re: Разбить символьную строку на составляющие  [new]
Диченка
Member

Откуда: ИТ-Олимп, 58.1-летний супермен
Сообщений: 3989
Огромное спасибо, Дмитрий!
13 окт 04, 07:51    [1028406]     Ответить | Цитировать Сообщить модератору
 Re: Разбить символьную строку на составляющие  [new]
Luchkin Dmitry
Member

Откуда: Новосибирск -> Ангарск -> Братск -> Мск
Сообщений: 1921
незачто - это первое, чему учат в школе...
13 окт 04, 07:55    [1028409]     Ответить | Цитировать Сообщить модератору
 Re: Разбить символьную строку на составляющие  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Для дальнейшего развития
https://www.sql.ru/articles/mssql/03060701ArraysAndListsInSQLServer.shtml
13 окт 04, 08:17    [1028438]     Ответить | Цитировать Сообщить модератору
 Re: Разбить символьную строку на составляющие  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Так вот, кто уязвимый код пишет! :)
13 окт 04, 11:13    [1029118]     Ответить | Цитировать Сообщить модератору
 Re: Разбить символьную строку на составляющие  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2676
Crimean
Так вот, кто уязвимый код пишет! :)

Обоснуйте, интересно все-таки!
13 окт 04, 11:33    [1029225]     Ответить | Цитировать Сообщить модератору
 Re: Разбить символьную строку на составляющие  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Достаточно строке стать чуть более длинной и раскапывание ошибок будет очень занимательным. Скажем, безобидный код

select 1 union all select 2

может выглядеть и как

select 1 union all sele

(синтакс еррор)

и как

select 1 unio

(ошибки нет, но это даже хуже)

А строка, которую реплейсят, может быть и параметром процедуры и "exec()" тут - самое то средство...
13 окт 04, 11:41    [1029269]     Ответить | Цитировать Сообщить модератору
 Re: Разбить символьную строку на составляющие  [new]
Диченка
Member

Откуда: ИТ-Олимп, 58.1-летний супермен
Сообщений: 3989
Crimean
Достаточно строке стать чуть более длинной и раскапывание ошибок будет очень занимательным. Скажем, безобидный код

select 1 union all select 2

может выглядеть и как

select 1 union all sele

(синтакс еррор)

и как

select 1 unio

(ошибки нет, но это даже хуже)

А строка, которую реплейсят, может быть и параметром процедуры и "exec()" тут - самое то средство...


Вот поэтому разработку сложных программных систем следует доверять только очень гениальным и талантливым людям навроде меня.
13 окт 04, 11:47    [1029295]     Ответить | Цитировать Сообщить модератору
 Re: Разбить символьную строку на составляющие  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
create table a0 (i int)
insert into a0 select 1
select * from a0

declare @c varchar(1000)
select @c= '|aaa|bbb|ccc|ddd|eee|''; drop table a0; select '''''
select @c= 'select '''+ replace(substring(@c, 2, len(@c)-2), '|', ''' union all select ''')+''''
exec (@c)

select * from a0
13 окт 04, 13:08    [1029733]     Ответить | Цитировать Сообщить модератору
 Re: Разбить символьную строку на составляющие  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Диченко
Вот поэтому разработку сложных программных систем следует доверять только очень гениальным и талантливым людям навроде меня


Гениальным и талантливым людям навроде тебя, раз уж им доверена разработка сложных програмных систем, стоит обратить внимание на такой несложный технический прием, как распарсивание строки по заранее указанным разделителям. Применение этого приема гарантирует стабильную работу кода и отсутствие уязвимостей. Скажем, вот так:

set	nocount	on

--	строка для распарсивания
declare	@s	varchar(1000)
select	@s	= '|aaa|bbb|ccc|ddd|eee|f'

print	@s

--	символ, по которому надо парсить
--	в случае чего можно легко перейти на patindex , а символ заменить WildCard маской
declare	@c	char(1)
select	@c	= '|'

--	сюда будем ложить покусанные слова. размер должен быть не меньше, чем у строки для распарсивания
declare	@cut	varchar(1000)

while	1=1	begin

	--	позиция разделителя в строке
	declare	@i	int
	select	@i	= charindex( @c, @s )

	--	разделителя нет. вся строка - одно слово
	if	@i = 0	begin

		select	@cut	= @s
		select	@s	= ''

	--	строка начинается с разделителя . пропускаем разделитель
	end	else
	if	@i = 1	begin

		select	@s	= substring( @s, 2, len( @s ))
		continue

	--	есть слово . кусаем его от строки , разделитель выкидываем
	end	else	begin

		select	@cut	= substring( @s, 1, @i-1 )
		select	@s	= substring( @s, @i+1, len( @s ))

	end

	print	@cut

	if	@s = ''
		break
end
13 окт 04, 13:23    [1029826]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить