2014-09-17 2 views
0

Я пробовал 2 способа, но оба они не работают внутри пользовательской функции. Это мой первый растворВычислить математику, используя функцию в SQL

-- 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 

Второе решение обыкновение компиляции, так как он не имеет права INSERT заявление внутри UFN.

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

Есть еще один способ сделать это?

Любая помощь будет оценена по достоинству.

Благодаря

+1

В чем именно ошибка Винсента? – Edper

+0

Проблема в том, что функция не может быть вызвана внутри функции. Вот кто-то с точно такой же проблемой: http://stackoverflow.com/questions/9850894/string-expression-to-be-evaluated-to-number Кажется, это невозможно сделать в SQL Server. –

+0

Вы не можете выполнить хранимую процедуру ('sp_executesql') или выполнить любые действия DML (' INSERT') из функции. –

ответ

1

Если версия SQL Server достаточно высока (SQL Server 2005 или более поздней версии), вы могли бы сделать оценку в .NET CLR function. Для этого обычно требуется, чтобы Visual Studio компилировала функцию CLR.

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