【问题标题】:Calculate Math using Function in SQL使用 SQL 中的函数计算数学
【发布时间】:2014-09-17 23:00:05
【问题描述】:

我尝试了 2 种方法,但都不能在用户定义的函数中工作。这是我的第一个解决方案

-- SELECT dbo.ufn_CalculateMath('(9 + 4 + 2) / 3')
ALTER FUNCTION ufn_CalculateMath
    (
      @mathExpr NVARCHAR(MAX)
    )
RETURNS DECIMAL(18, 4)
    BEGIN
        DECLARE @retVal DECIMAL(18, 4)       

        DECLARE @arithExpr NVARCHAR(MAX) = @mathExpr
        DECLARE @arithFor NVARCHAR(MAX) = N'SELECT @tempResult = '
            + @arithExpr

        EXECUTE sp_executesql @arithFor, N'@tempResult varchar(30) OUTPUT',
            @tempResult = @retVal OUTPUT

        RETURN  @retVal
    END

这是我的第二个

-- SELECT  dbo.ufn_CalculateMath2('(9 + 4 + 2) / 3') 
ALTER FUNCTION ufn_CalculateMath2
    (
      @mathExpr NVARCHAR(MAX)
    )
RETURNS DECIMAL(18, 4)
    BEGIN
        DECLARE @arithTemp NVARCHAR(MAX) = @mathExpr
        DECLARE @sql1 VARCHAR(MAX) = 'SELECT ' + @arithTemp
        DECLARE @TABLE TABLE ( result DECIMAL(18, 4) )

        INSERT  INTO @TABLE
                EXECUTE ( @sql1
                       )

        DECLARE @x DECIMAL(18, 4)

        SELECT  @x = result
        FROM    @TABLE

        RETURN  @x
    END

第二种解决方案无法编译,因为它不允许在 UFN 中添加 INSERT 语句。

第一个解决方案会编译,但运行时出错..

还有其他方法吗?

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 文森特到底是什么错误?
  • 问题可能是函数内部不能调用函数。这里有人遇到了完全相同的问题:stackoverflow.com/questions/9850894/… SQL Server 中似乎无法完成。
  • 您不能在函数内执行存储过程 (sp_executesql) 或执行任何 DML 操作 (INSERT)。
  • 开箱即用的问题:你为什么首先在 SQL 中做数学。我总是尽量避免在 SQL 中进行计算或制定业务规则。

标签: sql sql-server tsql


【解决方案1】:

如果您的 SQL Server 版本足够高(SQL Server 2005 或更高版本),您可以在.NET CLR function 中进行评估。这一般需要Visual Studio编译CLR函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多