Я пробовал 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.
Первое решение будет компилировать, но есть ошибка при работает ..
Есть еще один способ сделать это?
Любая помощь будет оценена по достоинству.
Благодаря
В чем именно ошибка Винсента? – Edper
Проблема в том, что функция не может быть вызвана внутри функции. Вот кто-то с точно такой же проблемой: http://stackoverflow.com/questions/9850894/string-expression-to-be-evaluated-to-number Кажется, это невозможно сделать в SQL Server. –
Вы не можете выполнить хранимую процедуру ('sp_executesql') или выполнить любые действия DML (' INSERT') из функции. –