【问题标题】:Msg 8152, Level 16, State 14, String or binary data would be truncate消息 8152,级别 16,状态 14,字符串或二进制数据将被截断
【发布时间】:2021-02-03 00:54:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql-server tsql type-conversion


    【解决方案1】:

    该错误通常涉及截断字符串(例如,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?
    • 如果要插入其他列,请检查其他字段。错误很可能来自那里。

    【讨论】:

    • 嗨,谢谢。我检查了其他列,问题出在那个列。我还在选择查询中测试了这个 CONVERT,它运行良好 - 没有警告。所以我认为它必须在 INSERT 中触发。
    • 是的 - 您表的字段 decimal_field_1 可能不正确,例如不是numeric(11,0)
    • 我创建了一个db<>fiddle,当你的数字太大时显示错误。它与过大的字符串不同。如果您的 CONVERT 作为 SELECT 工作,但在 INSERT 上失败,那么目标字段 imo 有问题。
    【解决方案2】:

    money 数据类型已被弃用一段时间。看看这个article 来避免它。

    “MONEY 在 -922,337,203,685,477.5808 (-922,337 万亿)和 922,337,203,685,477.5807(922,337 万亿)”

    尝试使用 DECIMAL(19, 4)

    insert into tab1(decimal_field_1) 
        select convert(numeric(19, 4), money_field_1) 
        from tab2;
    

    【讨论】:

    • 谢谢,但我还需要完全转换为 numeric(11,0) 或 DECIMAL(11,0)。
    • 如果数字太大而放不下怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多