Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как обработать и вернуть результат если выражение задано строкой, например 1,25*
|
|||
|---|---|---|---|
|
#18+
Суть в следующем, имеется таблица содержащая набор записей, причем простейших например 1,25*SF, 10/FD, (23/sf)*1,25, и т.д. причем переменных может быть от 0 до ну предположим 5. Вопрос - как вычилить значение и вернуть результат. Варианты есть , но дурацкие черезчур, хочется просто и надежно. Подскажите как быть. Резюме - есть набор выражений , как их вычислить на сервере и передать в хр. процедуру. Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2001, 17:54 |
|
||
|
Как обработать и вернуть результат если выражение задано строкой, например 1,25*
|
|||
|---|---|---|---|
|
#18+
Лучше бы, конечно, до этого не доводить, но... Если не писать транслятор, который бы делал синтаксический разбор выражения, то надо преобразовать выражение в вид, понятный серверу, преобразовать запятые в точки, переменные заменить значениями и выполнит выражение, как строку. Это может выглядеть примерно так: declare @SF varchar(32) declare @proc varchar(255) declare @i int ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2001, 09:15 |
|
||
|
Как обработать и вернуть результат если выражение задано строкой, например 1,25*
|
|||
|---|---|---|---|
|
#18+
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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2001, 09:16 |
|
||
|
Как обработать и вернуть результат если выражение задано строкой, например 1,25*
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2001, 11:12 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=46&tid=1825667]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 256ms |
| total: | 364ms |

| 0 / 0 |
