sql – 消息8114,级别16,状态5,行1错误将数据类型varchar转换为数字

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 

我正在尝试获取丢失的序列号,但是我收到了一个错误

Msg 8114, Level 16, State 5, Line 1 Error converting data type varchar to numeric.

有谁能够帮我?

最佳答案 在连接谓词中有一个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当ISNUMERIC(de.ornum)= 1那么CAST(de.ornum AS数字)ELSE NULL END = de1.ornum
>使用派生表在连接之前进行预转换(也很慢,但可能不那么慢 – 检查执行计划)

码:

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