首页 > 解决方案 > SQL ISNUMERIC 返回奇数结果

问题描述

所以我有这个查询:

SELECT 
    *
FROM
    (SELECT * FROM PE_ProductInstance WHERE ISNUMERIC(SerialStart) = 1) p
where 
    CAST(SerialStart AS int) < 8174

理论上,子查询应该过滤掉列SerialStart不是数字的任何结果。确实,当我查看以下结果时:

 SELECT * FROM PE_ProductInstance WHERE ISNUMERIC(SerialStart) = 1

column 的所有结果确实是数字SerialStart。所以我不明白为什么该查询会导致此错误:

将 nvarchar 值“8A0357”转换为数据类型 int 时转换失败。

还有什么奇怪的是这个查询什么都不返回:

SELECT
    *
FROM
    (SELECT * FROM PE_ProductInstance WHERE ISNUMERIC(SerialStart) = 1) p
where 
    SerialStart  = '8A0357'

我在这里做错了什么?

标签: sqlsql-servertsqlsql-server-2017

解决方案


Try_Cast 是执行此操作的正确方法。请参阅此代码:

DECLARE @table TABLE( 
    id int identity(1,1),
    name varchar(100));

INSERT into @table
VALUES
('1111'),('8A0357');

SELECT *
FROM @table p
WHERE TRY_CAST(p.Name AS int) < 8174;

推荐阅读