首页 > 解决方案 > 消息 8152,级别 16,状态 14,字符串或二进制数据将被截断

问题描述

我有将记录放入表的程序,特别是从字段数据类型 到money字段数据类型numeric(11,0)

insert into tab1(decimal_field_1) 
    select convert(numeric(11, 0), money_field_1) 
    from tab2

执行后我得到警告信息:

消息 8152,级别 16,状态 14
字符串或二进制数据将被截断

我有意识地将该列从 转换moneydecimal(11,0)并且我不想使用set ansi_warnings OFF.

那我做错了什么?如何正确转换该数据?

标签: sql-servertsqltype-conversion

解决方案


该错误通常涉及截断字符串(例如,varchar、nvarchar)而不是数字(例如,字符串太长而无法容纳)。

如果我有一个太大的货币价值转换为数字(11,0),它会给我错误Msg 8115, Level 16, State 8, Line 5 Arithmetic overflow error converting money to data type numeric.

因此,错误不太可能由 CONVERT 触发,而是在 INSERT 中触发。您可以通过执行一个select convert(numeric(11, 0), money_field_1) from tab2应该可以正常工作的方法来测试它 - 显示 CONVERT 很好。

您是否仅插入 1 列 decimal_field_1?

  • 如果是这样,您确定 decimal_field_1 也是 numeric(11,0) 而不是 varchar 或 nvarchar?
  • 如果要插入其他列,请检查其他字段。错误很可能来自那里。

推荐阅读