2016-01-07 2 views
2

У меня есть случай, когда мне нужно выполнить динамический расчет на основе определенной записи в столбце.SQL Server - Как выполнить вычисление на основе динамической формулы

таблица выглядит примерно так:

DECLARE Temp TABLE (
     Id INT, 
     Name NVARCHAR(255), 
     Const1 DECIMAL(18,10), 
     Const2 DECIMAL(18,10), 
     Const3 DECIMAL(18,10), 
     Const4 DECIMAL(18,10) 
    ); 

Я хочу, чтобы добавить в поле под названием «Расчет». Пользователь должен указать в этом поле, как должны применяться константы (т. Е. «Const1 * Const2 + (Const3 - Const4)»).

У меня есть функция, которая имеет формулу с жесткой кодировкой, но я хочу иметь возможность динамически сопоставлять столбцы таблицы в поле «Расчет». Это возможно? Если я получаю запись в таблице как:

ID| Name   | Const1 | Const2 | Const3 | Const4 | Calculation 
1 | Calculation1 |  5 |  3 |  2 |  9 | Const1 * Const2 + (Const3 - Const4) 

Тогда в моей функции, я могу динамически сделать расчет и вернуть это как выход? Правильно ли я подхожу к этой проблеме?

Заранее благодарен!

+0

Вы еще что-нибудь пробовали? –

+0

@Tom H Я добавил в новое поле формулу, как описано выше. Я пытаюсь выяснить, как сделать сопоставление с именем столбца, основанным на записи столбца varchar. – RizJa

+1

Не было бы лучше сделать это в слое над слоем базы данных? –

ответ

5

Вам понадобится динамический SQL с sp_executesql или EXEC. Я не помню, могут ли они использоваться в UDF или нет, и есть некоторые проблемы, о которых нужно знать, например SQL Injection и возможные проблемы с производительностью. У меня нет времени проверить, работает ли это в UDT, но вы хотели бы что-то вроде:

DECLARE @sql VARCHAR(MAX) 

SELECT @sql = 'SELECT ' + REPLACE(REPLACE(Calculation, 'Const1', Const1), 'Const2', Const2)... + ' AS result' 
FROM My_Table 
WHERE ID = 1 

EXEC(@sql) 
+0

Это было бы удивительно, но, к сожалению, похоже, что динамический SQL не может использоваться в UDF. – RizJa

+0

Похоже, это действительно так. Я не уверен, какие другие решения могут возникнуть, если вы привязаны к использованию функции. Я предполагаю, что ваши вычисления более сложны, чем простая математика с константами? –

+0

Расчеты довольно просты. Можно использовать до десяти констант, но это еще простая математика. Если бы не было зависимостей от этой функции, я был бы открыт для использования хранимой процедуры вместо UDF, но, к сожалению, это не простая задача в моем случае. – RizJa

Смежные вопросы