【问题标题】:How can I fix an "Arithmetic overflow error converting nvarchar to data type numeric.' error?如何修复“将 nvarchar 转换为数字数据类型的算术溢出错误。”错误?
【发布时间】:2013-11-22 22:34:42
【问题描述】:

我有一个简单的存储过程,其中将目标表和 where 子句条件指定为参数。 “将 nvarchar 转换为数字数据类型的算术溢出错误。”错误让我有点沮丧。

@TableName varchar(50), -- 'A_RECORD_ETH0' test value

@Time_ms decimal(18,4), -- '40388629085.6481' test value

@Records int out,       -- should result with '1' if test values are used

这行得通:

SELECT COUNT(*) as Count FROM A_RECORD_ETH0 WHERE Time_ms = 40388629085.6481

这行得通:

SET @sql = N'SET @Records = (SELECT COUNT(*) FROM A_RECORD_ETH0 WHERE Time_ms = 40388629085.6481 )'

EXEC sp_executesql @sql, N'@Records int output', @Records output

这行得通:

SET @sql = N'SET @Records = (SELECT COUNT(*) FROM '+ @TableName + ' WHERE Time_ms = 40388629085.6481 )'

EXEC sp_executesql @sql, N'@Records int output', @Records output

这会导致算术溢出错误:

SET @sql = N'SET @Records = (SELECT COUNT(*) FROM '+ @TableName + ' WHERE Time_ms = ' + @Time_ms + ' )'

EXEC sp_executesql @sql, N'@Records int output', @Records output

即使使用强制转换,这也会导致算术溢出错误:

SET @sql = N'SET @Records = (SELECT COUNT(*) FROM '+ @TableName + ' WHERE Time_ms = Cast ( ' + @Time_ms + ' as decimal(18,4)) )'

EXEC sp_executesql @sql, N'@Records int output', @Records output

【问题讨论】:

    标签: sql sql-server math casting overflow


    【解决方案1】:

    直接传递@Time_ms 避免了十进制->字符串->十进制的转换。它也更有效率;当@Time_ms 改变时,服务器仍然可以重用执行计划而不是生成一个新的。

    SET @sql = N'SET @Records = (SELECT COUNT(*) FROM '+ @TableName + ' WHERE Time_ms = @Time_ms'
    
    EXEC sp_executesql @sql, N'@Time_ms decimal(18,4), @Records int output', @Time_ms=@Time_ms, @Records output
    

    【讨论】:

      【解决方案2】:

      根据您的代码,我得到了以下工作:

      DECLARE @sqlSelect nvarchar(500);
      DECLARE @ParmSelect nvarchar(500);
      SET @sqlSelect = N'SET @RecordsOut = (SELECT COUNT(*) FROM ' + @TableName + ' WHERE Time_ms = @Time_msIn)'
      SET @ParmSelect = N'@Time_msIn decimal(18,4), @RecordsOut int OUTPUT';
      EXEC sp_executesql @sqlSelect, @ParmSelect, @Time_msIn = @Time_ms, @RecordsOut = @Records OUTPUT;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        • 1970-01-01
        • 2013-05-27
        相关资源
        最近更新 更多