23.01.2008, 16:02 | #1 |
Участник
|
Всем доброго времени суток.
Есть ли у кого нить функция на вход которой подаеться строка с фильтром в формате Nav (field1 3|6..10), а на выходе строка в формате SQL ( '(field1=(3) or field1=(6 between 10)' )? Заранее Огромное Спасибо! |
|
28.01.2008, 08:47 | #2 |
Участник
|
Немного конечно через зад, но работает
Код: ALTER FUNCTION [dbo].[f_filter_convert] (@var varchar(20), @cd varchar(250)) RETURNS varchar(1024) AS BEGIN --функция преобразует фильтр Navision в операторы SQL для использования в WHERE DECLARE @str varchar(1024); DECLARE @i int, @pos int, @pos2 int; DECLARE @tmp varchar(250); IF @cd = '' RETURN @var+' LIKE ''%'''; SET @str = @cd; SET @str = REPLACE(@str,'%','[%]'); SET @str = REPLACE(@str,'_','[_]'); SET @str = REPLACE(@str,'*','%'); SET @str = REPLACE(@str,'?','_'); SET @str = REPLACE(@str,'|',''' OR '+@var+' LIKE ''') SET @str = REPLACE(@str,'&',''' AND '+@var+' LIKE ''') SET @str = @var+' LIKE '''+@str+'''' SET @str = REPLACE(@str,')''',''')') WHILE CHARINDEX(@var+' LIKE ''(',@str) <> 0 SET @str = REPLACE(@str,@var+' LIKE ''(','('+@var+' LIKE ''') SET @str = REPLACE(@str,'LIKE ''<>','NOT LIKE ''') --Заменяем NOT LIKE на <>, если нет масок % и _ SET @i = 1 SET @pos = 0 WHILE @i <> 0 BEGIN SET @i = CHARINDEX('NOT LIKE ''',@str,@pos) IF @i <> 0 BEGIN SET @pos = CHARINDEX('''',@str,@i+10) SET @tmp = SUBSTRING(@str,@i,@pos-@i+1) IF CHARINDEX('%',@tmp) = 0 AND CHARINDEX('_',@tmp) = 0 BEGIN SET @str = STUFF(@str,@i,@pos-@i+1,STUFF(@tmp,1,9,'<>')) END END END --Заменяем LIKE на =, если нет масок % и _ SET @i = 1 SET @pos = 0 WHILE @i <> 0 BEGIN SET @i = CHARINDEX('LIKE ''',@str,@pos) IF @i <> 0 BEGIN SET @pos = CHARINDEX('''',@str,@i+6) SET @tmp = SUBSTRING(@str,@i,@pos-@i+1) IF CHARINDEX('%',@tmp) = 0 AND CHARINDEX('_',@tmp) = 0 BEGIN SET @str = STUFF(@str,@i,@pos-@i+1,STUFF(@tmp,1,5,'=')) END END END --Заменяем .. на BEETWEEN AND, если нет LIKE SET @i = 1 SET @pos = 0 WHILE @i <> 0 BEGIN SET @i = CHARINDEX(@var+' =''',@str,@pos) IF @i <> 0 BEGIN SET @pos = CHARINDEX('''',@str,@i+LEN(@var)+3) SET @tmp = SUBSTRING(@str,@i,@pos-@i+1) SET @pos2 = CHARINDEX('..',@tmp) IF CHARINDEX('%',@tmp) = 0 AND CHARINDEX('_',@tmp) = 0 AND @pos2 <> 0 BEGIN SET @tmp = @var+' BETWEEN '+SUBSTRING(@tmp,LEN(@var)+3,@pos2-LEN(@var)-3)+''' AND '''+SUBSTRING(@tmp,@pos2+2,LEN(@tmp)) SET @str = STUFF(@str,@i,@pos-@i+1,@tmp) END END END RETURN(@str); END |
|
29.01.2008, 22:00 | #3 |
Участник
|
Спасибо, попробую!
|
|
12.02.2008, 17:43 | #4 |
Участник
|
to grif
все работает отлично, только одно НО. зачем в условии IF CHARINDEX('%',@tmp) = 0 AND CHARINDEX('_',@tmp) = 0 AND @pos2 <> 0, где заменяем ".." на between AND CHARINDEX('_',@tmp) = 0? Возникла ситуация, при которой я передаю первым параметром значение [G_L Account No_] и фильтр "10..12", при этом "between" не ставиться. |
|
13.02.2008, 08:56 | #5 |
Участник
|
% Any string of zero or more characters.
_ (underscore) Any single character. '_' - это маска LIKE. Забыл сделать проверку на этот символ в имени переменной Можно вместо @var везде в теле вставлять какой-то текст типа '[#VAR#]', а потом в самом конце только заменить это на то что в @var |
|