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

时间:2013-09-26 02:31:41

标签: sql sql-server

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将数据类型varchar转换为numeric时出错。

有人能帮助我吗?

1 个答案:

答案 0 :(得分:2)

您的连接谓词中有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 ...