【发布时间】: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