Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Фунция работает и не работает, в чём может быть проблема?  [new]
Alexxx_22
Guest
Всем привет! Помогите разобраться, есть функция, которая работает, но работает не со всеми входными данными. Если строка вида: '3;12;1;5;' , то функция работает, немного меняем входные значения, типа '3;13;1;5;' , функция зацикливается и выдаёт: 5,11,11.... при отмене.

Функция:
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER FUNCTION [dbo].[last_index_out]
	(
	  @txt varchar(525)
	)
RETURNS VARCHAR(50)
AS
	BEGIN
	
  		declare @Id varchar(50), @i varchar(525), @res varchar(100)
		
		set @res = ''
		set @i=rtrim(ltrim(@txt))
		
		while (patindex('%;%',@i)>0)
	  	  begin
			set @i = Replace(@i,rtrim(ltrim(substring(@i,0,patindex('%;%',@i))))+';','')	
		  	if(len(@i)>0 and patindex('%;%',@i)>0) set @res = rtrim(ltrim(substring(@i,0,patindex('%;%',@i)))) 
		  end

		if(len(@res)=0 and len(@txt)>0) set @res = rtrim(ltrim(substring(@txt,0,patindex('%;%',@txt)))) 

             RETURN convert(varchar(50),@res)
END

Вызываем фунцию из хранимой процедуры:
     declare @app_flt nvarchar(50), @i nvarchar(10), @desc nvarchar(max), @rout nvarchar(max)

 

            set @app_flt = '3;13;1;5;'  -- '3;2;14;5;' так работает

                  while(patindex('%;%',@app_flt)>0)

                   begin      

                        select @i = convert(int,dbo.last_index_out(@app_flt))
                        if(len(@app_flt)>0 and patindex('%;%',@app_flt)>0) set @app_flt = Replace(@app_flt,convert(varchar,@i)+';','')

                        print @i 

                  end

В чём может быть причина?
Заранее спасибо за ответ.

Microsoft SQL Server 2008R2
3 авг 11, 11:47    [11063551]     Ответить | Цитировать Сообщить модератору
 Re: Фунция работает и не работает, в чём может быть проблема?  [new]
Philin
Member

Откуда: г. Иркутск
Сообщений: 162
Это вы таким образом хотите получить из строки несколько записей?

Если так, то вот первое, что пришло на ум:
declare @app_flt nvarchar(50)
set @app_flt = '3;3;13;1;5;'


SELECT Number
 INTO #Numbers
FROM master..spt_values
WHERE Type = 'P'

SELECT SUBSTRING(@app_flt, ISNULL(N1.Number, 0) + 1, N.Number - ISNULL(N1.Number, 0) - 1)
FROM #Numbers N
 LEFT JOIN #Numbers N1 ON N1.Number < N.Number and SUBSTRING(@app_flt, N1.Number, 1) = ';'
WHERE SUBSTRING(@app_flt, N.Number, 1) = ';'
	and PATINDEX('%;%', SUBSTRING(@app_flt, ISNULL(N1.Number, 0) + 1, N.Number - ISNULL(N1.Number, 0) - 1)) = 0


/*#Numbers - Таблица чисел от 0 до макс. длины строки*/
DROP TABLE #Numbers

Можно лучше сделать. Главное идея.
3 авг 11, 12:15    [11063788]     Ответить | Цитировать Сообщить модератору
 Re: Фунция работает и не работает, в чём может быть проблема?  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
Alexxx_22,

причина в том, что 3; посторяется два раза.
А функцию можно переписать, к примеру, так:
ALTER FUNCTION [dbo].[last_index_out]
	(
	  @txt varchar(525)
	)
RETURNS VARCHAR(50)
AS
BEGIN
   return reverse(rtrim(ltrim(substring(reverse(@txt), 2, isnull(nullif(charindex(';', reverse(@txt), 2), 0) - 2, len(@txt))))))
END
3 авг 11, 12:21    [11063839]     Ответить | Цитировать Сообщить модератору
 Re: Фунция работает и не работает, в чём может быть проблема?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
https://www.sql.ru/articles/mssql/03060701ArraysAndListsInSQLServer.shtml
3 авг 11, 12:34    [11063928]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить