【问题标题】:Msg 8114, Level 16, State 5, Line 1 Error converting data type varchar to numeric消息 8114,级别 16,状态 5,第 1 行将数据类型 varchar 转换为数字时出错
【发布时间】:2020-04-16 13:56:33
【问题描述】:
Select 
    CAST(de.ornum AS numeric) + 1 as ornum2 
from Cpaym as de
left outer join Cpaym as de1 on CAST(de.ornum AS numeric) = de1.ornum
where ISNUMERIC(de.ornum) = 1 

我正在尝试获取缺少的序列号,但出现错误:

消息 8114,级别 16,状态 5,第 1 行将数据类型 varchar 转换为数字时出错。

【问题讨论】:

  • 请发布您的架构(表结构、字段定义)。看看这个SO post的答案。
  • 对不起,但我不能......表已经填满......一千条记录......并且它的数据类型是 varchar......所以改变数据类型是不可能的。 .. :D
  • @JesunBicar:改变数据类型永远不会是不可能的,除非有人告诉你你没有时间,或者有一些第三方依赖于某种类型的数据。即使您必须保留它 varchar,您仍然可以清理数据,使其全部为数字。
  • 是的..我无权更改数据类型..当有人..将一些字符放在序列号上时这是人为错误...-_-跨度>
  • @JesunBicar:您仍然可以清理数据以消除这些字符。我会认真调查的。如果数据是垃圾(garbage-in,garbage-out),数据库将不会非常有效。

标签: sql sql-server


【解决方案1】:

您的连接谓词中有一个CAST(),它在WHERE 子句之前进行评估。如果de.ornum 不是数字,则此转换将失败。

另外,IsNumeric() 不能捕获所有数字类型,但在大多数情况下它可能已经足够好了。这是文档:http://technet.microsoft.com/en-us/library/ms186272(v=sql.105).aspx,这是描述 IsNumeric() 问题的(众多)文章中的一篇:http://classicasp.aspfaq.com/general/what-is-wrong-with-isnumeric.html

你可以做一些事情:

  • 修复您的架构,以便名为 ornum 的列实际上在所有拥有它的表中都包含一个数字。
  • 在连接谓词中使用CASE 表达式(速度很慢,但会起作用):... ON CASE WHEN ISNUMERIC(de.ornum) = 1 THEN CAST(de.ornum AS numeric) ELSE NULL END = de1.ornum
  • 在连接之前使用派生表进行预转换(也很慢,但可能不那么慢 -- 检查执行计划)

代码:

FROM (
  SELECT de.ornum
    FROM Cpaym AS de
   WHERE IsNumeric(de.ornum) = 1
) AS de
LEFT OUTER JOIN ...

【讨论】:

  • * 无法更改列架构,因为它得到了一些我不知道为什么的字符的注释...... - 我一直在尝试检查每个演员表.. 唯一的问题是第二次演员表。 . 我不知道如何解决它... 1st cast没问题..
  • 你真的读过答案吗?提供的三个解决方案中有两个不需要架构更改。它还清楚地解释了为什么第二个 CAST(在 JOIN 表达式中)会给您带来问题。
  • @JesunBicar:(1) 考虑过滤掉这些字符,然后更改架构,或者添加一个新列,该列只是可用于连接和索引等的数字。 (2) 我的回答是关于第二个演员。该演员表在连接谓词中。请参阅我的第一段了解为什么这不起作用。
  • 是的...我读过为什么第二次演员不起作用..对此有任何建议..因为其中一个数据有“13213.”...所以它给出了错误.. . 当我尝试删除所有字符时......它让我数据溢出......
  • @JesunBicar:我的第二个要点和第三个要点给出了可能的解决方案。但说真的,请尝试修复您的数据。您在表面上是数字的列中有非数字数据的事实将导致一个又一个的问题。您可以现在还清技术债务,也可以稍后还清,附带利息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多