如何在SQL标量函数中计算算术表达式

时间:2017-05-21 11:11:25

标签: sql sql-server user-defined-functions arithmetic-expressions

我正在尝试执行此标量函数,我尝试了很多方法来实现这一点,但我遇到了问题

Create FUNCTION CalculateElementFunc()
RETURNS int
AS
BEGIN
    DECLARE @ResultVar  numeric(18,6)
    DECLARE  @eq nvarchar(MAX)
    set @eq = '7.5/100*1258.236'    

    declare @expression nvarchar(max)
    set @expression = @eq

    declare @result int
    declare @SQLString nvarchar(max)
    Set @SQLString = N'Select @result = @expression'

    exec sp_executesql @SQLString, N'@expression nvarchar(100)', 
           @expression, 
           @result = @result output

    select @ResultVar = @result

    if( @ResultVar <> ROUND( @ResultVar, 2 ,1))
    set @ResultVar =  cast( ROUND( @ResultVar, 2 ,1) + .01 as numeric(18,2))

    RETURN @ResultVar
END

当我尝试执行它时

选择dbo.CalculateElementFunc()

我收到此错误

Msg 557,Level 16,State 2,Line 1 只能在函数内执行函数和一些扩展存储过程。

请建议

2 个答案:

答案 0 :(得分:1)

评论太长了。

在SQL Server中不建议您执行此操作。首先,这真的很难。如您所知,SQL Server函数无法执行动态SQL。

这在documentation

中是微妙的
  

调用扩展存储过程的EXECUTE语句。

execsp_executesql不是扩展存储过程。

你能做什么?以下是一些选项:

  1. 存储过程而不是UDF是否可能?存储过程可以执行动态SQL。
  2. 你能解决表达评估的问题吗?也许动态SQL可以在代码中使用一级。
  3. 可以执行扩展存储过程,启动另一个事务并执行动态SQL。想一想:表现真的很差。
  4. 您可以编写CLR扩展功能。

答案 1 :(得分:0)

SQL用户定义函数的限制:

  1. 函数中的非确定性构建不能用于用户定义的函数。例如GETDATE()或RAND()。
  2. 不支持XML数据类型。
  3. 不允许动态SQL查询。
  4. 除非在表变量上执行,否则用户定义的函数不支持任何DML语句(INSERT,UPDATE,DELETE)。
  5. 我们无法调用存储过程。只能从函数中调用扩展存储过程。
  6. 我们无法在UDF中创建临时表。
  7. 它不支持UDF中的错误处理。虽然,我们可以处理使用此函数的语句的错误(RAISEERROR,TRY-CATCH)。
  8. 看起来您正在使用/调用用户定义函数中的存储过程。这不是那种困扰你的表达,而是存储过程调用。

    尝试用一些逻辑替换它以实现所需的输出。

    希望这有帮助。如果它有助于解决您的问题,那么请不要忘记将其标记为答案。