【问题标题】:Msg 8115, Level 16, State 6, Line 4 Arithmetic overflow error converting varchar to data type numeric消息 8115,级别 16,状态 6,第 4 行算术溢出错误将 varchar 转换为数据类型 numeric
【发布时间】:2023-03-05 15:39:01
【问题描述】:

这是我写的查询。

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)

当我执行查询时,我得到 Msg 8115, Level 16, State 6, Line 4 将 varchar 转换为数据类型 numeric 时出现算术溢出错误。 为错误。

我尝试过强制转换、转换方法。

【问题讨论】:

    标签: sql sql-server


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

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

      在这种情况下

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

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

      你必须把它重写为

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

      【讨论】:

        猜你喜欢
        • 2020-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多