【问题标题】:Error converting data type nvarchar to real将数据类型 nvarchar 转换为 real 时出错
【发布时间】:2020-06-02 09:57:57
【问题描述】:

我需要减去两个 nvarchar 值并将结果存储在另一列中。我知道首先我需要将 nvarchar 转换为数值,但我总是收到此错误

将数据类型 nvarchar 转换为 real 时出错

提到 varchar 值仅存储数值,但我似乎无法正确进行此转换。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。同时显示您用于转换的代码。
  • 嗨。确切的错误是什么?它发生在哪个值上?
  • TRY_CONVERT (float, [ep.NovcanaKaznaUkupno]) - TRY_CONVERT (float, [eu.UplataNovcanaKaznaIznos]) As NKPreostalo 这给了我将数据类型 nvarchar 转换为 real 的错误
  • 帮助别人帮助你。减少您的问题是其他人可以帮助您解决的问题,并发布您实际执行的产生错误的语句。并发布您的数据示例。这将不可避免地引发关于为什么选择将数字存储为字符串的讨论——如果可能的话,这是你应该纠正的问题。因此,请指定该选项是否可行。如果不是,那就具体说出来,也许想想为什么。

标签: sql-server type-conversion numeric nvarchar


【解决方案1】:

你说...

只是提到在 varchar 值中只存储数值,但我 似乎无法正确进行此转换。

如果这绝对正确,那么在导致错误的项目中有 1 或 2 个尾随控制字符(制表符、回车、换行等)的可能性非常高。

首先尝试将 NVARCHAR 值转换为 MONEY 数据类型。它不适用于前导控制字符,但适用于尾随控制字符。显然,您的原始原始值当然不会超过 4 位小数。

【讨论】:

    【解决方案2】:

    使用 case 语句。它应该类似于(SELECT 中的 t-sql 伪代码)

    case when IsNumeric(column1) AND IsNumeric(column2) 
         then cast(column1 as decimal) - cast(column2 as decimal) 
    else NULL end as column3
    

    这是一个典型的例子,说明为什么你不应该混合类型(在这种情况下是 nvarchar 和 decimal),有各种各样的 shananigans - 比如 ('abc' - 5) 或 (NULL - NULL) 或 ('five ' - '3')。如果这可行,那么查看“NULL”结果可能是个好主意,因为这可能会为您提供宝贵的见解,了解系统中正在收集哪种垃圾。

    【讨论】:

      【解决方案3】:

      这看起来像是 SQL Server 错误。如果是这样,请使用try_convert()

      select try_convert(real, string_col)
      

      如果存在转换问题,这将返回 NULL 而不是错误。

      您可以使用以下方法找到违规值:

      select string_col
      from t
      where try_convert(real, string_col) is null and
            string_col is not null;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-14
        • 2015-12-24
        • 2012-09-25
        • 2012-07-23
        • 1970-01-01
        相关资源
        最近更新 更多