我刚刚在数据库中发现了一个查询失败,导致报告失败。查询的基本要点:
Select *
From table
Where IsNull(myField, '') <> ''
And IsNumeric(myField) = 1
And Convert(int, myField) Between @StartRange And @EndRange
现在,myField 并不在所有行中包含数字数据[它是nvarchar 类型]...但是这个查询显然是这样设计的:它只关心该字段中的数据是数字的行。
问题在于,T-SQL(据我所知)不会短路Where子句,从而导致它放弃数据不是数字的记录,但有例外:
Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the nvarchar value '/A' to data type int.
除了将 myField 为数字的所有行转储到临时表中,然后查询该字段在指定范围内的行之外,我能做什么是最佳的?
我的第一次解析纯粹是为了尝试分析返回的数据并查看发生了什么:
Select *
From (
Select *
From table
Where IsNull(myField, '') <> ''
And IsNumeric(myField) = 1
) t0
Where Convert(int, myField) Between @StartRange And @EndRange
但我得到了与第一个查询相同的错误,我不确定我是否理解,因为我此时没有转换任何不应该是数字的数据。子查询应该只返回 myField 包含数字数据的行。
也许我需要早茶,但这对任何人都有意义吗?另一双眼睛会有所帮助。
提前致谢