首页 > 解决方案 > 为什么不是一列中的所有值都没有转换

问题描述

我已将 csv 文件插入到 sql server 并现在进行投射。有一列包含(166742.9659)之类的值作为nvarchar,我想将其转换为十进制。我的查询是这样的

CAST([amount] AS decimal(18,2))     AS [amount]

我收到以下消息:

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

然后我尝试查询只是为了查看哪些值 aws 未转换

TRY_CAST([amount] AS decimal(18,2))     AS [amount]

然后我得到了 NULL 值的数量。当我在原始 csv 文件中检查这些值时,我发现这些数字与已成功转换的值具有相同的格式。例如:这个号码17011343.12被成功转换这个号码**166742.9659**得到空值

所以有没有人可以理解发生了什么?

标签: sqlsql-server

解决方案


这表明字符串中有意外字符。这需要调试。所以这是为了帮助你。

您需要对查询进行一些取证。一个起点是:

select amount, len(amount), len(ltrim(rtrim(amount)))
from staging
where TRY_CAST([amount] AS decimal(18,2)) is null and
      amount is not null;

您将需要手动计算字符以查看长度是否与您看到的相符。如果是这样,则表明其中一个数字实际上是其他数字(例如 aOl-- 大写 O 或小写 l)。或者小数位可能是其他句号。

如果它们不匹配,则恶意的其他字符已进入您的文件。


推荐阅读