【发布时间】:2019-05-09 19:05:56
【问题描述】:
所以我有这个查询:
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
列SerialStart 的所有结果确实是数字。所以我不明白为什么该查询会导致此错误:
将 nvarchar 值“8A0357”转换为数据类型 int 时转换失败。
还有什么奇怪的是这个查询什么都不返回:
SELECT
*
FROM
(SELECT * FROM PE_ProductInstance WHERE ISNUMERIC(SerialStart) = 1) p
where
SerialStart = '8A0357'
我在这里做错了什么?
【问题讨论】:
-
8A0357 不是数字,您正在执行 CAST(SerialStart AS int)
-
阅读这篇文章。 sqlservercentral.com/articles/…
-
@Hasan 我明白这一点。但是为什么子查询没有过滤掉'8A0357'?
-
不要使用
ISNUMERIC,使用TRY_CONVERT或TRY_CAST。但是如果SerialStart是一个数字,你为什么要传递8A9357?那不是一个数字。也许你的意思是颠倒逻辑,应该是`= 0`(或者更确切地说,TRY_CONVERT返回NULL) -
ISNUMERIC上的过滤器可能发生在CAST之后,尽管您使用了子查询。这就是这里正在发生的事情。ISNUMERIC('8A0357')返回0但CAST无论如何都会在它上面运行。
标签: sql sql-server tsql sql-server-2017