小编典典

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

sql

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转换为数值时出错。


阅读 448

收藏
2021-04-07

共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 ...
2021-04-07