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

4

1 回答 1

4

您的连接谓词中有一个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 ...
于 2013-09-26T02:37:13.207 回答