2013-11-22 138 views
0

我有其中目标表和where子句条件被指定为参数的简单存储过程。该“算术溢出错误转换nvarchar的数据类型的数字。”错误导致我有点挫折。如何解决“将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 

回答

1

直接传递@Time_ms可避免decimal-> string-> decimal转换。它也更高效;当@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', @[email protected]_ms, @Records output 
0

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

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; 
相关问题