Я работаю над проектом, в котором есть пара математических расчетов, которые необходимо выполнить на основе данных, переданных
Я написал триггер в SQL SERVER для вычисления этого значения. Я использовал REPLACE() для замены переменных значениями и получил следующее:
Например :
Value = 100 +a - (b*10)
a=1
b=2
Я получаю значение = 100 + 1 - (2 * 10)
Ожидаемый результат: значение = 81.
Я использую следующий запрос:
SELECT REPLACE(REPLACE(Value,'a',1),'b',2) FROM Formula
Есть ли лучший способ сделать это?
Лучший способ сделать то, что сделано? Мне кажется, что вы должны спросить своего учителя, своего наставника, свою команду, своего начальника — кого-то, кто знает, чего вы пытаетесь достичь, и может помочь с направлением. Вы смешиваете строковые и числовые литералы — это признак того, что вы не освоил базовый tsql. Чтобы успешно внедрить динамический tsql, вам нужно сначала освоить основы.
Вместо REPLACE
вы можете сохранить формулу как параметризованное выражение запроса и передать значения в качестве параметров:
DECLARE @value int;
DECLARE @formula nvarchar(MAX) = N'SET @Value = 100 + @a - (@b * 10);';
EXEC sp_executesql @formula, N'@value int OUTPUT, @a int, @b int', @a = 1, @b = 2, @value = @value OUTPUT;
PRINT @value;
Спасибо ! Но в моей таблице формул более 1000 таких значений, которые будут выбраны на основе переданного идентификатора. Кроме того, это был просто пример использования a,b . Таких полей около 10, значение которых будет получено из другой таблицы.
@charanya, какая таблица формул? Я не вижу упоминания об этом в вашем вопросе. Мой ответ - просто пример. Вам нужно будет применить этот метод к вашей реальной ситуации.
Я рекомендую против такого дизайна. Единственный способ получить значения — использовать динамический SQL. Если вы предоставляете литеральную строку
'100 +a - (b*10)'
для столбцаvalue
, а затем используете выражениеREPLACE
, вы получаете'100 + 1 -(2*10)
, а не81
, потому чтоvalue
по-прежнему являетсяvarchar
, аREPLACE
нет. t заставить литеральную строку интерпретироваться как выражение, а затем быть полученным. Скорее всего, это проблема XY.