Подставить значение в формулу с помощью триггера

Я работаю над проектом, в котором есть пара математических расчетов, которые необходимо выполнить на основе данных, переданных

Я написал триггер в 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

Есть ли лучший способ сделать это?

Я рекомендую против такого дизайна. Единственный способ получить значения — использовать динамический SQL. Если вы предоставляете литеральную строку '100 +a - (b*10)' для столбца value, а затем используете выражение REPLACE, вы получаете '100 + 1 -(2*10), а не 81, потому что value по-прежнему является varchar, а REPLACE нет. t заставить литеральную строку интерпретироваться как выражение, а затем быть полученным. Скорее всего, это проблема XY.

Larnu 27.05.2019 14:59

Лучший способ сделать то, что сделано? Мне кажется, что вы должны спросить своего учителя, своего наставника, свою команду, своего начальника — кого-то, кто знает, чего вы пытаетесь достичь, и может помочь с направлением. Вы смешиваете строковые и числовые литералы — это признак того, что вы не освоил базовый tsql. Чтобы успешно внедрить динамический tsql, вам нужно сначала освоить основы.

SMor 27.05.2019 15:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо 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, значение которых будет получено из другой таблицы.

chara 27.05.2019 15:23

@charanya, какая таблица формул? Я не вижу упоминания об этом в вашем вопросе. Мой ответ - просто пример. Вам нужно будет применить этот метод к вашей реальной ситуации.

Dan Guzman 27.05.2019 15:38

Другие вопросы по теме