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 ...