sql-server - 消息 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
字符串或二进制数据将被截断
我有意识地将该列从 转换money
为decimal(11,0)
并且我不想使用set ansi_warnings OFF
.
那我做错了什么?如何正确转换该数据?
解决方案
该错误通常涉及截断字符串(例如,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?
- 如果要插入其他列,请检查其他字段。错误很可能来自那里。
推荐阅读
- c++ - 在 ncurses 中发布多个表单:最初只有最后一个表单可见
- swift - 同一 EnvironmentObject 的多个实例
- javascript - 如何获取发送到 Vue 组件的默认内容槽?
- reactjs - 如何更改 npm 包 react-microsoft-login 按钮上的文本?
- javascript - 在Javascript中对嵌套的dict进行排序
- c# - 在调试器中停止,C# 线程挂在锁语句上,我如何确定哪个线程当前拥有锁?
- sql - 如何在Oracle中将带有一些服务符号的字符串转换为带有时区的时间戳?
- linux - 使用 ulimit -f 时陷阱信号 SIGXFSZ 不起作用
- javascript - “this”指的是“window”对象没有按预期工作
- json - 迷失在翻译中:在 Flutter 中将 JSON 解析为对象的问题