消息8115,级别16,状态6,行4算术溢出错误将varchar转换为数据类型numeric

时间:2015-05-27 15:53:51

标签: sql sql-server

这是我写的查询。

DECLARE @SQL_BULK VARCHAR(MAX)
declare @cp decimal(14,2)=1000
declare @tb varchar(20)='tbl_LT'
set @SQL_BULK='insert into '+@tb+'(ClosePrice) values('''+@cp+''');'
EXEC (@SQL_BULK)

当我执行查询时,我得到消息8115,级别16,状态6,行4 算术溢出错误将varchar转换为数据类型numeric。为错误。

我尝试过转换,转换方法。

2 个答案:

答案 0 :(得分:1)

+运算符在SQL Server中重载。如果任何参数是数字,那么它是一个字符串。

通常,我使用replace()执行您要执行的操作以防止此问题:

set @SQL_BULK = 'insert into @tb(ClosePrice) values(@cp)';
set @SQL_BULK = replace(@SQL_BULK, '@tb', @tb);
set @SQL_BULK = replace(@SQL_BULK, '@cp', @cb);
EXEC (@SQL_BULK)

注意:您应该使用`sp_executesql并将第二个值作为参数传递:

set @SQL_BULK = 'insert into @tb(ClosePrice) values(''@cp'')';
set @SQL_BULK = replace(@SQL_BULK, '@tb', @tb);
exec sp_executesql @SQL_BULK, N'@cb decimal(14, 2)', @cp = @cp;

答案 1 :(得分:0)

每当您将Numerics添加到字符串时,默认行为是将字符串转换为Number。

在这种情况下

set @SQL_BULK='insert into '+@tb+'(ClosePrice) values('''+@cp+''');'

您正在将@cp添加到导致问题的字符串中。

你必须重写为

set @SQL_BULK='insert into '+@tb+'(ClosePrice) values('''+CAST(@cp AS VARCHAR)+''');'