2012-05-07 2 views
0

У меня есть часть динамического SQL, внутри которой извлекается функция, зависящая от других результатов запроса, но также использует эти результаты для оценки этой функции. Я знаю, что eval() не существует в SQL, так что я использую?SQL Server - оценивать функцию в динамическом запросе

очень упрощенная версия

select reading, functiontype, @result = eval(f.functionformula) 
from readingstables r 
join functiontable f on (r.functiontype = f.functiontype) 

Так в основном (обратите внимание, это только пример формулы) Я хочу использовать functionformula, который связан с набором показаний через formulatype

если f.functiontype == 'A', то f.functionformula = чтение * чтение если f.functiontype == 'B', то f.functionformula = чтение * Костанта/anothervalue // и т.д. и т.п.

Настоящая версия объятие кусок динамического SQL в хранимой процедуре, которая управляет курсором. Я бы предпочел сделать это в одном запросе, но подозреваю, что мне, возможно, придется идти на компромисс и иметь второй динамический запрос, вызванный первым.

+0

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

ответ

1

Почему бы не просто использовать POWER функцию:

Case functionType 
    When 'A' Then Power(reading, 2) 
    When 'B' Then Power(reading, 3) 
    ... 
    End 

Вы могли бы даже получить супер фантазии, как так:

Power(reading, Ascii(functionType) - Ascii('A') + 2) 

Редактировать

Учитывая ваши изменения в вашей OP, вне динамического SQL, нет способа t o динамически выполнять вызов функции. Вы можете создать UDF, который принимает параметр типа функции и выполняет правильное выражение, однако сам UDF должен быть большим выражением Case.

Create Function FunctionTypeExpression(@FunctionType char(1)) 
Returns float 
As 

Return Case @FunctionType 
    When 'A' Then ..expression 1 
    When 'B' Then ..expression 2 
    ... 

Отметим, что в этом случае вам нужно будет вернуть возвращаемое значение функции, совместимой с любым возможным типом возврата из выражений. Надеемся, что они все числовые. Если они не все числовые (или весь текст), то потребуется более подробное объяснение того, почему это не так.

+0

Как я уже сказал, это упрощенная версия функции - реальные версии имеют несколько параметров и поддерживаются пользователем - поэтому таблица базы данных –

+0

@EricHewett - Это одна из причин, по которой полезно получить более подробную информацию о том, что вы на самом деле пытаетесь для достижения. Было бы лучше не включать формулы, если они действительно не являются в основном полномочиями другой ценности. – Thomas

+0

Согласен - я отредактировал этот вопрос, чтобы попытаться отразить это. –

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