使用计算在动态select子句上舍入sp_executesql的问题

时间:2016-03-13 07:11:39

标签: sql-server sql-server-2008 tsql dynamic-sql sp-executesql

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

感谢您的任何意见!

1 个答案:

答案 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 ...