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

标签 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 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 WHEN ISNUMERIC(de.ornum) = 1 THEN 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 ...

关于sql - 消息 8114,级别 16,状态 5,第 1 行将数据类型 varchar 转换为数字时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19018377/

相关文章:

sql - 使用 DashDB (DB2) 在复合 SQL 中执行 DDL

php - 通过输入类型文件更新 blob 文件

sql - 选择最近的邻居

sql-server - 无法删除 Amazon RDS SQL Server 数据库

sql - 需要修改查询而不使用交叉/外部应用

mysql 选择唯一行

sql - 更新列名未知的 SQL Server 临时表中的数据

sql - 在没有分布式事务的链接服务器上调用过程

mysql - 数据库中已删除记录的数字主键是否会被重新用于 future 的新记录?

sql-server - 在 SQL Server 中将金额分布到多行