powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как обработать и вернуть результат если выражение задано строкой, например 1,25*
5 сообщений из 5, страница 1 из 1
Как обработать и вернуть результат если выражение задано строкой, например 1,25*
    #32013309
Фотография Тимур
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суть в следующем, имеется таблица содержащая набор записей,
причем простейших например 1,25*SF, 10/FD, (23/sf)*1,25, и т.д.
причем переменных может быть от 0 до ну предположим 5.
Вопрос - как вычилить значение и вернуть результат.
Варианты есть , но дурацкие черезчур, хочется просто и надежно.
Подскажите как быть.

Резюме - есть набор выражений , как их вычислить на сервере и передать в хр. процедуру.

Заранее благодарен.
...
Рейтинг: 0 / 0
Как обработать и вернуть результат если выражение задано строкой, например 1,25*
    #32013315
Константин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше бы, конечно, до этого не доводить, но...
Если не писать транслятор, который бы делал синтаксический разбор выражения,
то надо преобразовать выражение в вид, понятный серверу,
преобразовать запятые в точки, переменные заменить значениями
и выполнит выражение, как строку.

Это может выглядеть примерно так:

declare @SF varchar(32)
declare @proc varchar(255)
declare @i int
...
Рейтинг: 0 / 0
Как обработать и вернуть результат если выражение задано строкой, например 1,25*
    #32013316
Константин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select @proc=upper('(23/sf)*1,25')

while CHARINDEX( ',',@proc)>0
begin
select @i=CHARINDEX( ',',@proc)
select @proc=STUFF(@proc,@i,1,'.')
end

select @SF='23.0'

while CHARINDEX( 'SF',@proc)>0
begin
select @i=CHARINDEX( 'SF',@proc)
select @proc=STUFF(@proc,@i,2,@SF)
end

select @proc='select '+@proc

execute (@proc)
...
Рейтинг: 0 / 0
Как обработать и вернуть результат если выражение задано строкой, например 1,25*
    #32013320
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO придется использовать курсор (к сожалению)

Не знаю, с какой точностью вам нужно вычислять результаты - я выбрал decimal(15,4). Если это не так, то замените в предложенном примере все decimal(15,4) на нужный вам тип


/*временная табличка для примера*/
create table #temp1(f1 varchar(50))
insert into #temp1 values('1,25*SF')
insert into #temp1 values('10/FD')
insert into #temp1 values('(23/sf)*1,25')

/*определяем значения всех переменных (я увидел только 2)*/
declare @SF_value varchar(32), @FD_value varchar(32)
set @SF_value = '23.0'
set @FD_value = '0.15'

declare @myformula varchar(1000), @myformula_value decimal(15,4)
declare @mysql_str nvarchar(500)

/*если по вашим словам у вас максимум 5 переменных, то по аналогии добавте еще 3 replace*/
DECLARE mycursor CURSOR LOCAL FORWARD_ONLY
FOR select replace(replace(replace(f1, ',', '.'), 'SF', @SF_value), 'FD', @FD_value) as myformula from #temp1

OPEN mycursor
FETCH NEXT FROM mycursor INTO @myformula
WHILE @@FETCH_STATUS = 0
BEGIN
print @myformula
SET @mysql_str = 'set @x = ' + @myformula
exec sp_executesql @mysql_str, N'@x decimal(15,4) output ', @x=@myformula_value output
print @myformula_value
FETCH NEXT FROM mycursor INTO @myformula
END

CLOSE mycursor
DEALLOCATE mycursor
drop table #temp1
...
Рейтинг: 0 / 0
Как обработать и вернуть результат если выражение задано строкой, например 1,25*
    #32013361
Фотография Тимур
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Класс, все работает , огромное СПАСИБО!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как обработать и вернуть результат если выражение задано строкой, например 1,25*
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]