Sql server 2008 转换失败(varchar到int)时使用ISNUMERIC结果的派生表进行查询

Sql server 2008 转换失败(varchar到int)时使用ISNUMERIC结果的派生表进行查询,sql-server-2008,tsql,derived-table,isnumeric,Sql Server 2008,Tsql,Derived Table,Isnumeric,下面是一个查询示例: DECLARE @table table (loc varchar(10)) INSERT INTO @table VALUES ('134a'), ('123'), ('abc'), ('124') SELECT * FROM ( SELECT * FROM @table WHERE ISNUMERIC(loc) = 1 ) as a WHERE CAST(loc as INT) BETWEEN 100 AND 200 如果我有一些varchar值,并且在

下面是一个查询示例:

DECLARE @table table (loc varchar(10))

INSERT INTO @table VALUES
('134a'), ('123'), ('abc'), ('124')

SELECT * 
FROM (
    SELECT * FROM @table WHERE ISNUMERIC(loc) = 1
) as a
WHERE CAST(loc as INT) BETWEEN 100 AND 200
如果我有一些varchar值,并且在查询的派生表中使用
ISNUMERIC
将它们限制为数值,为什么会导致转换错误

将varchar值“134a”转换为数据类型int时,转换失败


有办法解决这个问题吗?

首先执行
WHERE
子句。尝试:

DECLARE @table table (loc varchar(10)) 

INSERT INTO @table VALUES 
('134a'), ('123'), ('abc'), ('124') 

SELECT *  
FROM ( 
    SELECT * FROM @table
) as a 
WHERE ISNUMERIC(loc) = 1 and CAST(loc as INT) BETWEEN 100 AND 200 

要澄清的是:作为子查询具有该约束并不重要。SQL Server可以轻松地解开它。@GSerg您能否详细说明“因为它可以轻松地解开它”?SQL Server在执行前分析查询以生成执行计划。这个过程很深很好。通常,可以展开和展平的是。这包括子查询和引用视图,以及内联表值函数。因此,请参阅链接的问题以了解解决方法。@GSerg谢谢,
CASE
表达式可能是最简单的解决方法。是否有任何方法可以确保
ISNUMERIC(loc)
在100到200之间的
CAST(loc as INT)之前将执行
ISNUMERIC(loc)
?SQL Server保证从左到右计算具有相同优先级的运算符,但是,对于布尔表达式的短路计算没有保证。此外,行为可能在不同的上下文中有所不同,例如
IF
CASE
WHERE
。我希望我能引用一个权威性的参考资料,这将使这个问题得到解决。或者像其他一些语言一样,它们将支持显式
和_-THEN
或_-ELSE
运算符。