我在SQL Server的存储过程中遇到sp_executesql
的输出问题。以下是存储过程的一部分:
DECLARE @RET_Amt as NUMERIC(18,2)
DECLARE @v_Select nvarchar(200)
SET @v_select = 'SELECT @RET_Amt=(14315.00-10420.00) /10420.00'
exec sp_executesql @v_select,N'@RET_Amt numeric output', @RET_Amt output;
SELECT 'Return Value' = @RET_Amt
这会返回0.00
的输出,这是不正确的。当我们在提示符上执行select子句时:
select (14315.00-10420.00) / 10420.00
输出为:0.3738003838
所以sp_executesql
将结果四舍五入。有人帮助我获得价值而不用sp_executesql
四舍五入吗?我的存储过程是创建动态select子句并构建查询。所以我必须选择sp_executesql
。
感谢您的任何意见!
答案 0 :(得分:2)
您没有正确指定返回参数的精确度和比例 - 如果您没有指定任何内容,则默认为numeric(18,0)
- 这意味着无数字小数点后 - 因此舍入。
请改为尝试:
DECLARE @RET_Amt as NUMERIC(18,2)
DECLARE @v_Select nvarchar(200)
SET @v_select = 'SELECT @RET_Amt = (14315.00 - 10420.00) / 10420.00'
EXEC sp_executesql @v_select, N'@RET_Amt NUMERIC(18,2) OUTPUT', @RET_Amt OUTPUT;
SELECT 'Return Value' = @RET_Amt
在EXEC
语句中,您需要将@RET_Amt
定义为NUMERIC(18,2)
(就像您已定义变量一样) - 而不仅仅是numeric
...