Yogi@FLG Ответов: 1

Как я могу выполнить SQL-утверждение внутри udf в SQL?


Я хочу выполнить строковое выражение типа (7*8/4+1) внутри функции, как я могу достичь этого внутри функции.
@Переменная = (@выражение) не помогает, как @переменная рассматривая @expr как строковую переменную, а не как команда.
Пожалуйста, обратите внимание : я добавил выражение как 'Select' +@Expr.
Что плохого я здесь делаю? Большинство вещей, которые я нашел в интернете, бесполезны, так как я не могу использовать EXEC внутри функции, поскольку она возвращает только если команда выполнена или нет, а не результат команды.
Как я могу заставить @expr вести себя как команда sql, когда речь заходит о строке
@Переменная = (@выражение).
Пожалуйста, проведите меня через это.

Что я уже пробовал:

объявить @оценивали десятичное число(18,2)
объявить @vexpr varchar(MAX) = ((15 * 4) + 1)
объявить @formula varchar(max) = @vexpr
SET @formula = 'Select' +@formula
Набор @формула = заменить(@формула , "", ")
SET @evaluated = (@формула)

возвращение @оценивали;

Код опубликовал любые зацепки или подсказки

Когда я выполняю вышеуказанную функцию, я получаю ошибку, как показано ниже :-
Ошибка преобразования типа данных varchar в числовой.

Patrice T

Покажи свой код.

Yogi@FLG

объявить @оценивали десятичное число(18,2)
объявить @vexpr varchar(MAX) = ((15 * 4) + 1)
объявить @formula varchar(max) = @vexpr
SET @formula = 'Select' +@formula
Набор @формула = заменить(@формула , "", ")
SET @evaluated = (@формула)

возвращение @оценивали;

Код опубликовал любые зацепки или подсказки

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Yogi@FLG

Когда я выполняю вышеуказанную функцию, я получаю ошибку
Ошибка преобразования типа данных varchar в числовой.

Yogi@FLG

Когда я выполняю код я получаю ошибку

Ошибка преобразования типа данных varchar в числовой.

CHill60

Опубликуйте код вместо того, чтобы пытаться его описать

Yogi@FLG

объявить @оценивали десятичное число(18,2)
объявить @vexpr varchar(MAX) = ((15 * 4) + 1)
объявить @formula varchar(max) = @vexpr
SET @formula = 'Select' +@formula
Набор @формула = заменить(@формула , "", ")
SET @evaluated = (@формула)

возвращение @оценивали;

Код опубликовал любые зацепки или подсказки

1 Ответов

Рейтинг:
0

Santosh kumar Pithani

CREATE TABLE #TEMP(formula NVARCHAR(500))
INSERT INTO #TEMP(formula ) 
    VALUES('((15 * 4) + 1)'),('((15/4) + 1)'),('((15 * 4) *(1+7))');

DECLARE @Grandtot NVarchar(500),@Query NVARCHAR(MAX)

SELECT @Grandtot=STUFF((SELECT '+CAST('+formula+' AS FLOAT)' FROM #TEMP FOR XML 
                     PATH(''),type).value('.','NVARCHAR(500)'),1,1,'');

SET @Query=N'SELECT '+@Grandtot+' AS GrandTot';

EXEC(@Query);



OUTPUT:
------
GrandTot
-----
545


Yogi@FLG

Но мне нужно вызвать это из функции, а функции не поддерживают SPs.
Есть еще какие-нибудь обходные пути для решения этой проблемы?

CHill60

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

Yogi@FLG

Вызывающая функция-это скалярная функция, в которой я должен вычислить математическую формулу/выражение, основанное на некоторых условиях, используя некоторые параметры, и значения этой формулы основаны на параметрах, переданных этой функции. Я получаю формулу только внутри функции и после вычисления этого выражения возвращаю это значение .

Santosh kumar Pithani

Привет йог, вы можете использовать скалярную функцию с помощью дополнительных параметров, таких как ex:-((@a * @b) + @c) внутри вашей функции.

Yogi@FLG

Привет Сантош, это не моя точная проблема,у меня есть a,b и c, но как я могу оценить выражение, например, взять ваш пример ((@a*@b)+@c) и вернуть это значение, которое я заменяю на a, b и c, и теперь я хочу получить значение для моего математического выражения.

Чтобы быть более беглым , я получаю это выражение ((@a*@b)+@c)внутри самой функции , у меня есть формула, которую я получаю из параметров, переданных этой функции, я не могу передать даже формулу, так как для конкретных условий у меня может быть более одной формулы или выражения, и после того, как я получу вычисленное выражение, я суммирую его и возвращаю это значение суммы.

Santosh kumar Pithani

Если вы знали все математические формулы, то используйте их непосредственно внутри функции по условию if.

Yogi@FLG

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

Santosh kumar Pithani

Как вы получаете все формулы,есть ли таблица для хранения всех формул ?

Yogi@FLG

Да. У меня есть таблица, где хранятся все формулы.

Santosh kumar Pithani

Хорошо, используйте функцию XML Stuff, чтобы сделать Grandtotal, а затем добавить к динамическому запросу

Yogi@FLG

Ладно, давай я попробую...

Yogi@FLG

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

Santosh kumar Pithani

Конечно

Santosh kumar Pithani

Привет йог, решение обновляется проверьте его один раз...если все в порядке отметьте его как решение.